C# DataGridView 中 DataGridViewComboBoxCell 下拉列表框设置选择事件

本文介绍了一个关于DataGridView中使用ComboBox进行编辑时如何添加和移除事件处理程序的方法。通过在DataGridViewEditingControlShowing事件中为DataGridViewComboBoxEditingControl绑定SelectedIndexChanged和Leave事件,实现了对下拉列表框的选择更改和焦点离开的响应。
    private void DataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {

            if (StoreSwap_Tab_DataGridView.CurrentCell != null && e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
            {
                //创建下拉列表框改变事件
                (e.Control as ComboBox).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
                //创建下拉列表框离开焦点事件 添加该事件是为了删除动态事件 以免多次调用
                (e.Control as ComboBox).Leave += new EventHandler(ComboBox_Leave);
            }
        }
        //离开焦点事件
    private void ComboBox_Leave(object sender, EventArgs e)
        {
            //删除动态调用
            (sender as ComboBox).SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
            (sender as ComboBox).Leave -= new EventHandler(ComboBox_Leave);
        }
        //下拉列表框改变事件
    private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {

        }   

### 如何在 C#设置 `DataGridViewComboBoxColumn` 的默认索引并处理其选择改变事件 #### 设置默认索引 为了设置 `DataGridViewComboBoxColumn` 的默认索引,可以通过遍历每一行并将对应的组合框单元格的值设置为其默认项来完成。以下是具体实现方式: ```csharp // 假设 dataGridView 已经初始化,并且已经添加了一个名为 comboBoxColumn 的 DataGridViewComboBoxColumn 列 foreach (DataGridViewRow row in dataGridView1.Rows) { if (!row.IsNewRow) // 跳过新行模板 { ((DataGridViewComboBoxCell)row.Cells["comboBoxColumnName"]).Value = ((DataGridViewComboBoxCell)row.Cells["comboBoxColumnName"]).Items[0]; // 设置为第一个选项作为默认值 } } ``` 上述代码通过访问每行中的 `DataGridViewComboBoxCell` 单元格,并将其值设置为下拉列表的第一个项目[^2]。 --- #### 实现选择改变事件处理方法 对于 `DataGridViewComboBoxColumn` 的选择改变事件,可以监听 `CellValueChanged` 或者更具体的 `CurrentCellDirtyStateChanged` 事件。需要注意的是,如果不手动管理这些事件,则可能会遇到重复触发的问题[^1]。 以下是一个完整的解决方案,用于捕获用户更改 ComboBox 的操作: ```csharp private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty && dataGridView1.CurrentCell is DataGridViewComboBoxCell) { dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); } } private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex >= 0 && e.RowIndex >= 0 && dataGridView1.Columns[e.ColumnIndex].Name.Equals("comboBoxColumnName")) { var selectedValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; // 处理选中值变化逻辑 MessageBox.Show($"Selected Value Changed to: {selectedValue}"); } } ``` 在此代码片段中: - 使用 `CurrentCellDirtyStateChanged` 来检测当前单元格的状态是否已修改。 - 当状态发生变化时,调用 `CommitEdit` 方法提交编辑内容。 - 随后,在 `CellValueChanged` 事件中获取新的选定值并执行相应的业务逻辑。 --- #### 动态绑定数据源 如果需要动态绑定数据到 `DataGridViewComboBoxColumn`,则可以在创建列时指定 `DataSource` 属性。例如: ```csharp List<string> items = new List<string>() { "Option1", "Option2", "Option3" }; DataGridViewTextBoxColumn comboBoxColumn = new DataGridViewTextBoxColumn(); comboBoxColumn.Name = "comboBoxColumnName"; comboBoxColumn.DataSource = items; // 绑定数据源 comboBoxColumn.DisplayMember = "Text"; // 如果是复杂对象,需指定显示成员 comboBoxColumn.ValueMember = "Text"; // 同样适用于复杂对象的情况[^4] dataGridView1.Columns.Add(comboBoxColumn); // 初始化默认值 foreach (DataGridViewRow row in dataGridView1.Rows) { if (!row.IsNewRow) { ((DataGridViewComboBoxCell)row.Cells["comboBoxColumnName"]).Value = items.FirstOrDefault(); // 默认第一项 } } ``` 此部分展示了如何将自定义集合绑定至 `DataGridViewComboBoxColumn` 并初始化默认值。 --- #### 注意事项 为了避免多次触发事件,建议仅在必要时注册事件处理器,并确保每次只注册一次。此外,当更新或重新加载表格数据时,应小心重置默认值以保持一致性[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值