Windows 窗体 DataGridView 将 SelectedIndexChanged 事件附加到 ComboBox
Posted
技术标签:
【中文标题】Windows 窗体 DataGridView 将 SelectedIndexChanged 事件附加到 ComboBox【英文标题】:Windows Form DataGridView attach SelectedIndexChanged event to ComboBox 【发布时间】:2015-11-08 14:42:19 【问题描述】:我在 Windows 窗体应用程序中有一个 DataGridView。该 DataGridView 中有两个 ComboBox 列。在第一个 ComboBox 中选择一些值时,我希望能够填充第二个 ComboBox。代码如下:
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());
如果我从第一个 ComboBox(DataGridView 的第一列)中选择一些值,效果很好,但是在选择第一列值之后,如果我从第二个 ComboBox(DataGridView 的第二列)中选择一些值,事件 FirstComboSelectionChanged
也会被触发(显示空值)!!
似乎该事件也与第二个 ComboBox 相关联。
有什么办法可以防止吗?
【问题讨论】:
这只是一个简单的错误,组合框被重新用于编辑第 2 列。但是您从未取消订阅该事件,因此它一直在触发。您通过在分配之前显示格式化值来使错误更加复杂。毫无疑问,有更好的方法可以做到这一点,但您只显示了错误的代码,而没有任何提示您为什么需要此事件处理程序。 【参考方案1】:这并不完全是您的答案,而是一个简单的解决方案。
您可以像这样使用dataGridView1_CurrentCellDirtyStateChanged
事件而不是comboBox.SelectedIndexChanged
event:
void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
if (dataGridView1.IsCurrentCellDirty)
if (dataGridView1.CurrentCell.ColumnIndex == 0)
MessageBox.Show(dataGridView1.CurrentCell.EditedFormattedValue.ToString());
【讨论】:
以上是关于Windows 窗体 DataGridView 将 SelectedIndexChanged 事件附加到 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中对 dataGridView 列进行排序? (Windows 窗体)
如何将.net中DataGridView中的数据导出到Excel文本(是在windows窗体中)
WPF DataGrid 与 Windows 窗体 DataGridView
如何从 c# Windows 窗体中文本框的文本内容更新 datagridview 的列