DataGridViewColumnCollections是否具备类似ComboBox的ValueMember/DisplayMember区分机制?
DataGridView实现显示名称/操作ID的方案
DataGridView本身没有像ComboBox那样直接提供ValueMember/DisplayMember的全局属性,但完全不需要用隐藏列这种繁琐方式,有几种更优雅的实现思路:
1. 使用DataGridViewComboBoxColumn(下拉选择场景)
如果这列是需要用户选择的下拉列,直接用DataGridViewComboBoxColumn即可,它和普通ComboBox一样支持DisplayMember和ValueMember:
// 创建下拉列 DataGridViewComboBoxColumn fooColumn = new DataGridViewComboBoxColumn(); fooColumn.Name = "FooColumn"; fooColumn.DisplayMember = "FooRealName"; // 用户看到的名称 fooColumn.ValueMember = "FooID"; // 后台操作的ID fooColumn.DataSource = yourFooCollection; // 绑定Foo数据集合 dataGridView1.Columns.Add(fooColumn); // 绑定DataGridView数据源时,直接关联FooID字段 dataGridView1.DataSource = yourDataSource; fooColumn.DataPropertyName = "FooID";
这种情况下,用户看到的是FooRealName,但代码中获取单元格值时得到的是FooID,完全符合需求。
2. 普通文本列:通过CellFormatting事件转换显示内容
如果是仅用于显示的文本列,可以绑定FooID,然后在CellFormatting事件中将ID转换为对应的名称显示:
// 添加绑定FooID的列 DataGridViewTextBoxColumn fooColumn = new DataGridViewTextBoxColumn(); fooColumn.Name = "FooColumn"; fooColumn.DataPropertyName = "FooID"; // 绑定后台的ID字段 dataGridView1.Columns.Add(fooColumn); // 处理CellFormatting事件 private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.ColumnIndex == dataGridView1.Columns["FooColumn"].Index && e.Value != null) { int fooId = Convert.ToInt32(e.Value); // 根据ID获取对应的名称,替换成你实际的获取逻辑 string realName = GetFooRealNameById(fooId); e.Value = realName; e.FormattingApplied = true; // 标记已完成格式化,避免重复处理 } }
此时用户看到的是名称,而后台操作时直接从单元格的Value(或绑定的数据源)获取FooID即可。
3. 绑定包含双属性的数据源,仅显示名称列
如果你的数据源对象同时包含FooID和FooRealName,可以只添加显示FooRealName的列,需要操作ID时直接从绑定的对象中获取:
// 数据源是包含FooID和FooRealName的集合 dataGridView1.DataSource = yourFooDataCollection; // 添加仅显示名称的列 DataGridViewTextBoxColumn fooColumn = new DataGridViewTextBoxColumn(); fooColumn.Name = "FooRealNameColumn"; fooColumn.DataPropertyName = "FooRealName"; dataGridView1.Columns.Add(fooColumn); // 获取选中行的FooID时,直接从DataBoundItem取 var selectedFoo = (YourFooModel)dataGridView1.SelectedRows[0].DataBoundItem; int targetFooId = selectedFoo.FooID;
这种方式最简洁,完全不需要额外处理,数据源本身携带ID,只是不显示对应的列而已。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

