如何为绑定的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】:

您不需要使用“重”DataTableList&lt;Item&gt;可以成功绑定DataGridView

然后在KeyDownevenhandler 中你可以访问当前选中行的有界项。

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 的每个单元格的值?

DataGridView 中彩色单元格的计数

如何为绑定到 List<T> 的 dataGridView 设置 columnNames?

如何为 Xib 设置单元格动态高度的约束...?

如何为 UITableView 中的每个单元格类别指定特定的部分名称

C#怎样取消用户对datagridview单元格的修改