我不知道我的思想今天是否有效,或者这实际上是否比我认为的更难。
我有一个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应该能够直接返回它。
另外,在这种情况下我不能使用词典。
关于实现这一目标的最佳方法的任何想法?
答案 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