2015-08-15 72 views
3

我在Windows窗体应用程序中有一个DataGridView。 DataGridView中有两个ComboBox列。在选择第一个ComboBox中的某个值时,我希望能够填充第二个ComboBox。下面是代码:Windows窗体DataGridView将SelectedIndexChanged事件附加到组合框中

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     try 
     { 
      if (dataGridView1.CurrentCell.ColumnIndex == 0 && e.Control is ComboBox) 
      { 
       ComboBox comboBox = e.Control as ComboBox; 
       comboBox.SelectedIndexChanged -= FirstComboSelectionChanged; 
       comboBox.SelectedIndexChanged += FirstComboSelectionChanged; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
    private void FirstComboSelectionChanged(object sender, EventArgs e) 
    { 
     var sendingCB = sender as DataGridViewComboBoxEditingControl; 
     MessageBox.Show(sendingCB.EditingControlFormattedValue.ToString()); 
    } 

它工作得很好,如果我选择第一个组合框(DataGridView中的第一列)一定价值,但第一列值选择后,如果我再选择第二个组合框的一些值(DataGridView中的第二列)事件FirstComboSelectionChanged也被触发(显示空值)!

看起来事件也会附带第二个ComboBox。

有什么办法可以防止这种情况发生?

+0

这只是一个简单的错误,组合框被重新使用也能修改第2列。但是你从来没有退订的事件,因此它只是保持射击。您在分配之前通过显示格式化值来复杂化该错误。毫无疑问,有更好的方法来做到这一点,但你只显示错误的代码,没有提示你为什么需要这个事件处理程序。 –

回答

0

这不完全是你的答案,但是一个简单的解决方案。

你可以这样使用,而不是comboBox.SelectedIndexChanged事件dataGridView1_CurrentCellDirtyStateChanged事件:

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty) 
     { 
      if (dataGridView1.CurrentCell.ColumnIndex == 0) 
      MessageBox.Show(dataGridView1.CurrentCell.EditedFormattedValue.ToString()); 
     } 
    } 
相关问题