2009-08-31 7 views
1

Je crée un DataGridView avec une colonne DataGridViewComboBoxColumn. Initialement, la zone de liste déroulante Éléments est remplie de valeurs à l'aide de Items.Add ("sometext").Ajouter des éléments à DataGridViewComboBoxColumn dans DataGridView pendant l'exécution

D'autres valeurs sont ajoutées au DataGridViewComboBoxEditingControl renvoyé dans l'événement EditingControlShowing de DataGridView. Ci-après, je peux sélectionner correctement les valeurs ajoutées initialement, mais si j'essaie de sélectionner une valeur ajoutée plus tard, une exception avec le message "Valeur de DataGridViewComboBoxCell n'est pas valide." Est lancé.

Des idées pourquoi?

Répondre

3

Vous devez gérer l'événement ComboBoxValidating, puis l'ajouter à cet événement. Voici un code:

private void HandleEditShowing(
     object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     var cbo = e.Control as ComboBox; 
     if (cbo == null) 
     { 
      return; 
     } 

     cbo.DropDownStyle = ComboBoxStyle.DropDown; 
     cbo.Validating -= HandleComboBoxValidating; 
     cbo.Validating += HandleComboBoxValidating; 
    } 

    private void HandleComboBoxValidating(object sender, CancelEventArgs e) 
    { 
     var combo = sender as DataGridViewComboBoxEditingControl; 
     if (combo == null) 
     { 
      return; 
     } 
     //check if item is already in drop down, if not, add it to all 
     if (!combo.Items.Contains(combo.Text)) 
     { 
      var comboColumn = this.dataGridView1.Columns[ 
       this.dataGridView1.CurrentCell.ColumnIndex] as 
        DataGridViewComboBoxColumn; 
      combo.Items.Add(combo.Text); 
      comboColumn.Items.Add(combo.Text); 
      this.dataGridView1.CurrentCell.Value = combo.Text; 
     } 
    } 

Ainsi, lorsque vous gérez l'événement EditingControlShowing, crochet dans l'événement Validating du combobox. Ensuite, cet événement se déclenchera une fois que l'utilisateur a entré du texte dans la zone de liste déroulante DataGridView et en a supprimé les tabulations. À ce stade, vous devez l'ajouter à la zone de liste déroulante elle-même, ainsi que le DataGridViewColumn réel afin que toutes les autres lignes dans le DataGridView aient cette valeur.

0

Essayez ceci,

DataGridViewComboBoxColumn Column_ModemList = (DataGridViewComboBoxColumn)this.DGV_Groups.Columns["DGV_Groups_ModemList"]; 
Column_ModemList.Items.Add(l_modem_str); 

Note: Set AllowUserToAddRows propriété à false.

Questions connexes