如何在绑定的DataGridViewComboBoxCell中获取对底层对象的引用?

时间:2009-02-05 17:00:58

标签: c# .net vb.net winforms datagridview

我不知道我的思想今天是否有效,或者这实际上是否比我认为的更难。

我有一个DataGridView,其DataGridViewComboBoxColumn绑定到CustomObjects的通用IList。这是我如何设置列的粗略代码示例。

DataGridViewComboBoxColumn location = new DataGridViewComboBoxColumn() 
{
    Name = "Location",
    DataSource = new BindingSource(GetMyLocations(), null),
    DisplayMember = "Name",
    ValueMember = "ID"
};

然后当我想返回一个单元格的值时:

string id = (string)row.Cells["Location"].Value;

但我不想引用ID属性,我想要一个对实际Location对象的引用!我已经尝试过不指定ValueMember,但似乎只是使用了DisplayMember。

我可以遍历DataSource列中的所有Location对象并检查匹配的ID属性,但是,似乎ComboBoxCell应该能够直接返回它。

另外,在这种情况下我不能使用词典。

关于实现这一目标的最佳方法的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用IList KeyValuePair的“名称”和您的自定义对象。您的想法是需要ValueMember指向对象的引用。我记得ComboBox es。

有一段时间有类似的问题

像下面的东西应该做的伎俩(在我的头顶和未经测试):

IList<KeyValuePair<String,MyObject>> comboData = 
    new IList<KeyValuePair<String,MyObject>>();

foreach(var o in GetMyLocations())
    comboData.Add(new KeyValuePair<String,MyObject>(o.Name, o));

DataGridViewComboBoxColumn location = new DataGridViewComboBoxColumn()
{
    Name = "Location",
    DataSource = comboData,
    DisplayMember = "Key",
    ValueMember = "Value"
};

您可能希望更改GetMyLocations()以返回KeyValuePair列表,因此您无法无缘无故地填充两个列表。

答案 1 :(得分:0)

public class Thing
{
    public string id{  get ;  set ; }
    public string Name  {  get ;  set ; }

    //self ref
    public Thing This
    {
        get { return this; }
    }
}



form_load(){
      comboboxcell.ValueMember = "This";  // self ref
      comboboxcell.DisplayMember = "Name";
}


 datagridview1.CellValueChanged += (s, e) => {
    var cb = (DataGridViewComboBoxCell)dgv_titles.Rows[e.RowIndex].Cells[e.ColumnIndex];
   var selectedObject  = (Thing)cb.Value  ;
}

这是我遇到的最简单,最干净的方式。

http://mikehadlow.blogspot.com/2006/09/problems-with-datagridviewcomboboxcolu.html