我有一个绑定了<int, Object>
字典的组合框。
现在组合框应该显示&#34; Name&#34;对象的属性。
使用ComboBox的DrawItem事件,我设法获得下拉部分以显示Name属性。
问题是,一旦选择了一个项目,文本字段就会显示object.ToString()文本。
有没有办法让textfield显示&#34; Name&#34;所选项目的属性?
修改
这是问题的示例代码
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
答案 0 :(得分:1)
编辑:以前的答案没有解决问题
感谢你添加你的代码我已经尝试了并提出了一些有用的东西(至少对我而言)如果你在Obj中覆盖.ToString()方法就像这样
internal class Obj
{
public string Name;
public override string ToString()
{
return Name;
}
}
然后你得到的是一个如下所示的列表:
[1,姓名A]
[2,姓名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;