将 <int,object> 字典绑定到组合框
binding <int,object> dictionary to a Combobox
我有一个绑定了 <int, Object>
字典的组合框。
现在组合框应该显示对象的 "Name" 属性。
使用 ComboBox 的 DrawItem 事件,我设法让下拉部分显示名称 属性。
问题是,一旦选择了一个项目,文本字段就会显示 object.ToString() 文本。
有没有办法让文本字段显示所选项目的 "Name" 属性?
编辑:
这是问题的示例代码
class Class1
{
private ComboBox CB;
private Dictionary<int, Obj> ObjList;
private Obj ObjA;
private Obj ObjB;
private BindingSource BS;
public Class1(ComboBox cb)
{
CB = cb;
CB.DrawMode = DrawMode.OwnerDrawVariable;
CB.DrawItem += CB_DrawItem;
ObjList = new Dictionary<int, Obj>();
ObjA = new Obj();
ObjA.Name = "Name A";
ObjB = new Obj();
ObjB.Name = "Name B";
ObjList.Add(1, ObjA);
ObjList.Add(2, ObjB);
BS = new BindingSource(ObjList, null);
BS.ResetBindings(false);
CB.DataSource = BS;
CB.Update();
}
private void CB_DrawItem(object sender, DrawItemEventArgs e)
{
ComboBox lst = sender as ComboBox;
if (e.Index >= 0)
{
KeyValuePair<int, Obj> kv = (KeyValuePair<int, Obj>)lst.Items[e.Index];
var o = kv.Value;
e.DrawBackground();
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
e.Graphics.DrawString(o.Name, CB.Font, SystemBrushes.HighlightText, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
}
else
{
e.Graphics.DrawString(o.Name, CB.Font, SystemBrushes.ControlText, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
}
e.DrawFocusRectangle();
}
}
internal class Obj
{
public string Name;
}
}
这是组合框的屏幕截图:
enter image description here
编辑:之前的回答没有解决问题
感谢您添加您的代码我已经尝试过并想出了一些有用的东西(至少对我来说)如果您像这样覆盖 Obj 中的 .ToString() 方法
internal class Obj
{
public string Name;
public override string ToString()
{
return Name;
}
}
然后你得到的是一个如下所示的列表:
[1, Name A]
[2, Name B]
但这并不完全是你想要的(我不认为)但是如果你在这里添加这一行
BS = new BindingSource(ObjList, null);
BS.ResetBindings(false);
CB.DataSource = BS;
CB.DisplayMember = "Value"; // Add this line here
CB.Update();
它的工作方式如您所愿,如果您的 CB_DrawItem 函数是一种解决方法,那么您也可以将其与以下两行一起删除:
CB.DrawMode = DrawMode.OwnerDrawVariable;
CB.DrawItem += CB_DrawItem;
这是一张显示结果的图片(希望它像你的一样 link 但不确定如何操作)
我有一个绑定了 <int, Object>
字典的组合框。
现在组合框应该显示对象的 "Name" 属性。
使用 ComboBox 的 DrawItem 事件,我设法让下拉部分显示名称 属性。
问题是,一旦选择了一个项目,文本字段就会显示 object.ToString() 文本。
有没有办法让文本字段显示所选项目的 "Name" 属性?
编辑:
这是问题的示例代码
class Class1
{
private ComboBox CB;
private Dictionary<int, Obj> ObjList;
private Obj ObjA;
private Obj ObjB;
private BindingSource BS;
public Class1(ComboBox cb)
{
CB = cb;
CB.DrawMode = DrawMode.OwnerDrawVariable;
CB.DrawItem += CB_DrawItem;
ObjList = new Dictionary<int, Obj>();
ObjA = new Obj();
ObjA.Name = "Name A";
ObjB = new Obj();
ObjB.Name = "Name B";
ObjList.Add(1, ObjA);
ObjList.Add(2, ObjB);
BS = new BindingSource(ObjList, null);
BS.ResetBindings(false);
CB.DataSource = BS;
CB.Update();
}
private void CB_DrawItem(object sender, DrawItemEventArgs e)
{
ComboBox lst = sender as ComboBox;
if (e.Index >= 0)
{
KeyValuePair<int, Obj> kv = (KeyValuePair<int, Obj>)lst.Items[e.Index];
var o = kv.Value;
e.DrawBackground();
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
e.Graphics.DrawString(o.Name, CB.Font, SystemBrushes.HighlightText, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
}
else
{
e.Graphics.DrawString(o.Name, CB.Font, SystemBrushes.ControlText, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
}
e.DrawFocusRectangle();
}
}
internal class Obj
{
public string Name;
}
}
这是组合框的屏幕截图: enter image description here
编辑:之前的回答没有解决问题
感谢您添加您的代码我已经尝试过并想出了一些有用的东西(至少对我来说)如果您像这样覆盖 Obj 中的 .ToString() 方法
internal class Obj
{
public string Name;
public override string ToString()
{
return Name;
}
}
然后你得到的是一个如下所示的列表:
[1, Name A]
[2, Name B]
但这并不完全是你想要的(我不认为)但是如果你在这里添加这一行
BS = new BindingSource(ObjList, null);
BS.ResetBindings(false);
CB.DataSource = BS;
CB.DisplayMember = "Value"; // Add this line here
CB.Update();
它的工作方式如您所愿,如果您的 CB_DrawItem 函数是一种解决方法,那么您也可以将其与以下两行一起删除:
CB.DrawMode = DrawMode.OwnerDrawVariable;
CB.DrawItem += CB_DrawItem;
这是一张显示结果的图片(希望它像你的一样 link 但不确定如何操作)