将 <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 但不确定如何操作)