如何设置绑定DataGridView的单元格的标记的值?

时间:2017-06-29 11:53:21

标签: c# winforms datagridview datatable

以下课程是我正在处理的一个例子:

{
    "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的单元格的标记?

2 个答案:

答案 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)

你不需要使用&#34; heavy&#34; DataTableList<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");