如何为绑定的DataGridView的单元格的标签设置值?
Posted
技术标签:
【中文标题】如何为绑定的DataGridView的单元格的标签设置值?【英文标题】:How to set a value to the tag of the cell of a bound DataGridView? 【发布时间】:2017-06-29 11:53:21 【问题描述】:以下课程是我正在处理的示例:
class Item
public int ID get;set;
public string Name get;set;
public int Quantity get;set;
public string Unit get;set;
public override string ToString()
return string.Format("0(1)23", Name,Quantity,Environment.NewLine,Unit);
class Items
List<Item> _items;
public DataTable AllItems()
var dt = new DataTable();
// Some manipulation to convert the list to a datatable
// ...
return dt;
class UI
public void PopulateDatagridview()
//Some code to create the items
// ...
datagridview1.DataSource = items.AllItems();
private void datagridview1_KeyDown(object sender, KeyEventArgs e)
if (e.Control && e.KeyCode == Keys.C) // Control + c
// here I need to copy only the item name
我只需要从网格中复制项目名称,简单而“丑陋”的解决方案是解析单元格文本,然后获取项目名称。 但是每次更新我的 Item.ToString() 时,我都必须更新此代码。 我认为的一种解决方案是将项目 ID 保存在每个单元格中,这样我就可以轻松地从项目对象中检索项目名称。 我想将项目 ID 保存到单元格的 Tag 属性中,但由于我通过将 DataTable 绑定到其 DataSource 来填充 DataGridView,因此无法保存它。
有没有办法将值保存到绑定的 DataGridView 的单元格的标记中?
【问题讨论】:
如何在 DataTable 中创建一个 DataGridView 不可见的新列? 其实是在复制datagridview,id是针对每个cell的 抱歉,您的 Item 类代表 Cell 而不是 Row 这一事实对我来说并不明显。 你是对的,我试图简化结构以简化问题,实际上并不像你提到的那样明显。谢谢 【参考方案1】:恐怕您的问题是在创建 DataTable 期间。试试这个:
var table = new DataTable("foo");
table.Columns.Add("Column", typeof(Item));
table.Rows.Add(new Item() Name = "Foo", Quantity = 1, Unit = "kb" );
dataGridView1.DataSource = table;
然后您可以以键入的方式处理选择,而不是解析字符串:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
if (e.Control && e.KeyCode == Keys.C)
Console.WriteLine("Copying: " + (dataGridView1.SelectedCells[0].Value as Item).Name);
【讨论】:
【参考方案2】:您不需要使用“重”DataTable
。 List<Item>
可以成功绑定DataGridView
。
然后在KeyDown
evenhandler 中你可以访问当前选中行的有界项。
class UI
public void PopulateDatagridview()
var items = new List<Item> // - create/load items
datagridview1.DataSource = items;
private void datagridview1_KeyDown(object sender, KeyEventArgs e)
if (e.Control && e.KeyCode == Keys.C)
var gridView = (DataGridView)sender;
var item = (Item)gridView.CurrentRow.DataBoundItem;
var nameForCopy = item.Name;
// use nameForCopy ...
如果你是DataTable
的忠实粉丝——你仍然可以使用相同的方法,但只需要将有界项转换为DataRowView
,然后通过.Row
属性访问值。
var gridView = (DataGridView)sender;
var rowView = (DataRowView)gridView.CurrentRow.DataBoundItem;
var nameForCopy = rowView.Row.Field<string>("Name");
【讨论】:
以上是关于如何为绑定的DataGridView的单元格的标签设置值?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取与表连接绑定的 Row datagridview selectedItem 的每个单元格的值?
如何为绑定到 List<T> 的 dataGridView 设置 columnNames?