如何在listBox C#中显示包含列表的字典

时间:2014-08-22 14:34:22

标签: c# winforms dictionary listbox

我目前有一个字典,其中包含一个键值和一个与该键相关的列表。 我已阅读How to bind Dictionary to ListBox in winforms,当我尝试实现它时,它只显示键值。

我要做的是有两个单独的列表框。在框1中,选择键值,当发生这种情况时,框2显示列表。目前的代码如下:

var xmlDoc2 = new XmlDocument();
xmlDoc2.Load(textBox1.Text);
Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);

var node = xmlDoc2.SelectNodes("pdml/packet/proto[@name='ip']/@showname");

foreach (XmlAttribute attribute1 in node)
 {
   string ip = attribute1.Value;
   var arr = ip.Split(); var src = arr[5]; var dst = arr[8];

   List<string> l;
   if (!dict.TryGetValue(src, out l))
     {
        dict[src] = l = new List<string>();
     }

   l.Add(dst);

   listBoxSRC.DataSource = new BindingSource(dict, null);
   listBoxSRC.DisplayMember = "Value";
   listBoxSRC.ValueMember = "Key";

  }

到目前为止,它显示了listBoxSRC中的键值,这很好。我需要做的是在listBoxDST中显示列表。

我还看过使用ListView来解决这个问题,但我无法弄清楚它是如何工作的。

我知道应该有一个listBoxSRC_SelectedIndexChange某个地方,但我一直在这个上下文中出现&#39; dict&#39;错误。

由于

1 个答案:

答案 0 :(得分:1)

我用一对列表框快速记下了一些东西。只需在其中添加一对列表框,然后连接事件即可自行尝试。通过使用SelectedItem并将其作为KeyValuePair投射,您不必在方法范围之外声明该字典,如下所示。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        listBox1.DataSource = new BindingSource(new Dictionary<string, List<string>>
        {
            {"Four-Legged Mammals", new List<string>{"Cats", "Dogs", "Pigs"}},
            {"Two-Legged Mammals", new List<string>{"Humans", "Chimps", "Apes"}}
        }, null);

        listBox1.DisplayMember = "Value";
        listBox1.ValueMember = "Key";
    }

    private void listBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem != null)
        {
            var keyValue = (KeyValuePair<string, List<String>>) listBox1.SelectedItem;
            listBox2.DataSource = keyValue.Value;
        }
        else
        {
            listBox2.DataSource = null;
        }
    }