【问题标题】:How to display a Dictionary in a ListBox如何在列表框中显示字典
【发布时间】:2009-05-19 22:05:17
【问题描述】:

我正在尝试将键/值对从字典显示到列表框。

Key Value
A    10
B    20
C    30

我想以下列格式在 ListBox 中显示它们

A(10)
B(20)
C(30)

使用以下代码,我已经能够将 Listbox.Datasource 链接到 Dictionary。

myListBox.DataSource = new BindingSource(myDictionary, null);

显示为

[A, 10]
[B, 20]
[C, 30]

我不知道如何格式化它才能以我想要的方式显示。

我们将不胜感激。

谢谢 灰烬

【问题讨论】:

  • 您可能希望在此问题中添加一个标签,指示您使用的语言。此外,您可以选择代码并按 ctrl-k 对其进行格式化。欢迎使用 Stackoverflow。

标签: dictionary listbox


【解决方案1】:

使用列表框上的 Format 事件:

KeyValuePair<string, int> item = (KeyValuePair<string, int>)e.ListItem;
e.Value = string.Format("{0}({1})", item.Key, item.Value);

【讨论】:

    【解决方案2】:

    为了获得适当的长期灵活性,我会尝试使用类型化对象,然后您可以稍后做任何您喜欢的事情,引发事件,更改值,不必使用唯一键,从列表框中获取真实对象,而不仅仅是格式化字符串

    public partial class tester : Form
    {
        public tester()
        {
            InitializeComponent();
             List<MyObject> myObjects = new List<MyObject>();
            MyObject testObject = new MyObject("A", "10");
            myObjects.Add(testObject);
           BindingSource bindingSource = new BindingSource(myObjects,null);
            listBox1.DisplayMember = "DisplayValue";
            listBox1.DataSource = bindingSource;
        }
    }
    
    public  class MyObject
    {
        private string _key;
        private string _value;
    
        public MyObject(string value, string key)
        {
            _value = value;
            _key = key;
        }
    
        public string Key
        {
            get { return _key; }
        }
    
        public string Value
        {
            get { return _value; }
        }
    
        public string DisplayValue
        {
            get { return string.Format("{0} ({1})", _key, _value); }
        }
    }
    

    【讨论】:

    • 是的,这是一个更好的全方位解决方案,应该被标记为 IMO 的答案。
    【解决方案3】:

    您可以遍历字典对象并随时构建列表框项。

      foreach (KeyValuePair<string, int> kvp in myDictionary)
      {
          lbx.Items.Add(String.Format("{0}({1})", kvp.Key, kvp.Value.ToString()));
      }
    

    【讨论】:

    • 但是,您必须解析字符串值才能在别处单独检索键或值。此外,您还会失去数据绑定。
    【解决方案4】:

    其实如果你想自定义列表框从它派生并覆盖

    protected override OnDrawItem

    答案 1 将得到您在问题中陈述的内容,但如果您想反映对象的变化,最好编写绘图例程以便它自动反映。

    或者您可以更改项目的文本,这也可以解决问题。

    别忘了调用 BeginUpdate() 和 EndUpdate()

    【讨论】:

    • 无需派生自定义列表框。只需处理 DrawItem 事件。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2014-10-17
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多