将<int,object>字典绑定到Combobox

时间:2018-02-20 21:22:55

标签: c# combobox datasource

我有一个绑定了<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

1 个答案:

答案 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;

这是显示结果的图片(希望它像你的链接,但不知道该怎么做) Preview Pic