以下课程是我正在处理的一个例子:
{
"ccseq_importdate" : "2017-05-28T04:00:00Z",
"ccseq_month" : "1",
"ccseq_year" : "2017",
"ccseq_name" : "Test",
"ccseq_status" : "100000000",
"ccseq_ccseq_expensetransactionset_ccseq_expensetransaction_ExpenseTransactionSetID" :
[
{
"@odata.type": "Microsoft.Dynamics.CRM.ccseq_navemployee",
"ccseq_employeeid@odata.bind": "/systemusers(6d2fd71b-32d1-dd11-a4f5-001a6449bbe7)",
"ccseq_clientid@odata.bind": "/ccseq_clients(663ebd00-73b9-4faf-90ed-f56bb9c2dc9b)",
"ccseq_navemployeeid" : "11111",
"ccseq_employeefirstname" : "John"
}
]
}
我只需要从网格中复制项目名称,简单而“丑陋”的解决方案是解析单元格文本然后获取项目名称。 但每次我的Item.ToString()更新时,我都必须更新此代码。 我解决的一个解决方案是在每个单元格中保存项目ID,这样我就可以轻松地从items对象中检索项目名称。 我想将Item ID保存到单元格的Tag属性,但由于我通过将DataTable绑定到DataSource来填充DataGridView,我无法保存它。
有没有办法将值保存到绑定的DataGridView的单元格的标记?
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
你不需要使用" heavy" 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");