2017-06-29 63 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"); 
相關問題