2009-08-31 58 views
1

我正在创建DataGridView和DataGridViewComboBoxColumn列。最初,组合框项目使用Items.Add(“sometext”)填充值。在运行期间将项目添加到DataGridView中的DataGridViewComboBoxColumn

在DataGridView的EditingControlShowing事件中返回的DataGridViewComboBoxEditingControl中增加了更多值。

此后我可以正确选择最初添加的值,但是如果我尝试选择一个稍后添加了消息“DataGridViewComboBoxCell值无效”的异常。被抛出。

任何想法,为什么?

回答

3

您需要处理ComboBoxValidating事件,然后将其添加到那里。这里有一些代码:

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; 
     } 
    } 

所以当你处理EditingControlShowing事件时,钩入组合框的Validating事件。然后,一旦用户在DataGridView组合框中输入了一些文本并将其跳出,该事件就会触发。此时,您需要将其添加到组合框本身以及实际的DataGridViewColumn中,以便DataGridView中的所有其他行都具有该值。

0

试试这个,

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

注:设置AllowUserToAddRows属性false