2017-06-29 25 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()が更新されるたびにこのコードを更新する必要があります。 しかし、1つの解決策は、各セルにアイテムIDを保存することでした。その方法でアイテムオブジェクトからアイテム名を簡単に取得できました。 アイテムIDをセルのTagプロパティに保存しますが、DataTableをDataSourceにバインドしてDataGridViewにデータを設定しているため、保存できません。

バインドされたDataGridViewのセルのタグに値を保存する方法はありますか?

+0

DataGridViewで表示されないDataTableに新しい列を作成するとどうなりますか? – vasek

+0

実際にはdatagridviewを複製しています。各セルのIDは – ehh

+0

です。申し訳ありませんが、あなたのItemクラスがRowではなくCellを表しているという事実は私には分かりませんでした。 – 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

あなたは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"); 
関連する問題