2017-06-29 59 views
0

下面的类是我处理的是什么一个例子:如何将值设置为绑定的DataGridView的单元格的标记?

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}){2}{3}", 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保存在每个单元格中,这样我就可以轻松地从项目对象中检索项目名称。 我想将Item ID保存到单元格的Tag属性,但由于我通过将DataTable绑定到它的DataSource来填充DataGridView,我无法保存它。

有没有办法将值保存到绑定的DataGridView的单元格的标记?

+0

如何在DataTable中创建DataGridView不可见的新列? – vasek

+0

它实际上是复制datagridview,id是针对每个单元的 – ehh

+0

对不起,您的Item类表示Cell而不是Row的事实对我来说并不明显。 – vasek

回答

0

恐怕你的问题是在创建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); 
    } 
} 
0

你并不需要使用“重” 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"); 
相关问题