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.SelectedIndexChangedevent:

  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 的列

Windows 窗体:从网站到 dataGridView 的 XML

如何直接在 Windows 窗体应用程序上编辑/添加/更新 datagridview