获取DataGridViewComboBoxCell的显示值和基础值

本文介绍如何从DataGridView中的DataGridViewComboBoxCell单元格获取显示值和基础值。通过具体代码示例展示了如何针对指定行和列的单元格,读取其下拉列表中的特定项的显示文本和基础数据。

 

获取DataGridView 的 DataGridViewComboBoxCell单元格的显示值和基础值

 

DataGridViewCell cell = dataGridView.Rows[r].Cells[c];//得到单元格
if (cell is DataGridViewComboBoxCell)
{
    DataGridViewComboBoxCell cb = cell as DataGridViewComboBoxCell;

    string showValue = ((System.Data.DataRowView)cb.Items[n])[cb.DisplayMember].ToString();//显示值

    string baseValue = ((System.Data.DataRowView)cb.Items[n])[cb.ValueMember].ToString();//基础值

    //cell.Value是下拉框的索引值
}

这个错误(`System.ArgumentException: DataGridViewComboBoxCell value is not valid`)通常发生在以下情况: 1. 用户选择的不在 `ComboBox` 的有效项列表中 2. 数据类型不匹配(如 `ValueMember` 是 `int` 但赋为 `string`) 3. 数据绑定后未正确设置 `ValueMember`/`DisplayMember` --- ### **解决方案** #### **1. 验证数据源完整性** 确保绑定的数据源包含所有可能的: ```csharp // 正确绑定数据源(示例) var comboColumn = new DataGridViewComboBoxColumn { DataSource = GetValidItems(), // 返回 List<Item> ValueMember = "Id", // 必须是数据源中的属性名 DisplayMember = "Name", Name = "ItemsColumn" }; ``` #### **2. 处理无效** 通过 `DataError` 事件捕获异常: ```csharp dataGridView1.DataError += (sender, e) => { if (e.Exception is ArgumentException argEx && argEx.Message.Contains("ComboBoxCell")) { e.ThrowException = false; MessageBox.Show("请选择有效的"); // 可选:重置为默认 dataGridView1.CurrentCell.Value = DBNull.Value; } }; ``` #### **3. 强制类型匹配** 确保赋时的类型与 `ValueMember` 类型一致: ```csharp // 正确赋(假设ValueMember是int) dataGridView1.Rows[0].Cells["ItemsColumn"].Value = 2; // 使用ID而非字符串 // 错误示例(会引发异常) dataGridView1.Rows[0].Cells["ItemsColumn"].Value = "2"; // 字符串 vs int ``` #### **4. 动态数据源时的特殊处理** 如果数据源是动态加载的,需在显示前刷新: ```csharp // 动态更新数据源后执行 comboColumn.DataSource = null; comboColumn.DataSource = updatedItems; comboColumn.ValueMember = "Id"; comboColumn.DisplayMember = "Name"; ``` --- ### **完整调试流程** 1. **检查数据源** 在赋前输出数据源内容,确认包含目标: ```csharp Debug.WriteLine(string.Join(",", ((List<Item>)comboColumn.DataSource).Select(i => i.Id))); ``` 2. **验证单元格类型** 检查赋实际类型是否匹配: ```csharp var cellValue = dataGridView1.Rows[0].Cells["ItemsColumn"].Value; Debug.WriteLine(cellValue?.GetType()); // 应为int(与ValueMember一致) ``` 3. **检查绑定字段名** 确保 `ValueMember` `DisplayMember` 拼写完全正确(区分大小写): ```csharp var firstItem = ((List<Item>)comboColumn.DataSource)[0]; Debug.WriteLine(firstItem.GetType().GetProperty(comboColumn.ValueMember) != null); // 应为True ``` --- ### **特殊场景处理** #### **允许空** 如果需要允许空,需显式处理: ```csharp // 在数据源中添加空项 var items = new List<Item> { new Item { Id = -1, Name = "" } } .Concat(GetValidItems()).ToList(); // 或者手动验证 if (dataGridView1.CurrentCell.Value == null) { dataGridView1.CurrentCell.Value = DBNull.Value; } ``` #### **运行时修改数据源** 动态增减数据项时,使用 `BindingList` 自动通知界面: ```csharp var bindingList = new BindingList<Item>(GetValidItems()); comboColumn.DataSource = bindingList; // 动态添加项 bindingList.Add(new Item { Id = 99, Name = "New Item" }); ``` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值