C# 如何在列表框C中显示包含列表的词典#

C# 如何在列表框C中显示包含列表的词典#,c#,winforms,dictionary,listbox,C#,Winforms,Dictionary,Listbox,我目前有一个字典,其中包含一个键值和一个与该键值关联的列表。 我读过,当我尝试实现它时,它只显示键值 我想做的是有两个独立的列表框。在框1中选择键值,此时框2显示列表。当前代码如下: var xmlDoc2 = new XmlDocument(); xmlDoc2.Load(textBox1.Text); Dictionary<string, List<string>> dict = new Dictionary<string, List<string>

我目前有一个字典,其中包含一个键值和一个与该键值关联的列表。 我读过,当我尝试实现它时,它只显示键值

我想做的是有两个独立的列表框。在框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";

  }
var xmlDoc2=new XmlDocument();
xmlDoc2.Load(textBox1.Text);
Dictionary dict=新字典(StringComparer.OrdinalIgnoreCase);
var node=xmlDoc2.SelectNodes(“pdml/packet/proto[@name='ip']/@showname”);
foreach(节点中的XmlAttribute attribute1)
{
字符串ip=attribute1.Value;
var arr=ip.Split();var src=arr[5];var dst=arr[8];
清单l;
如果(!dict.TryGetValue(src,out l))
{
dict[src]=l=新列表();
}
l、 添加(dst);
listBoxSRC.DataSource=newbindingsource(dict,null);
listBoxSRC.DisplayMember=“Value”;
listBoxSRC.ValueMember=“Key”;
}
到目前为止,它的作用是在listBoxSRC中显示键值,这很好。我需要做的是在listBoxDST中显示列表

我还研究了使用ListView来纠正这个问题,但我不知道它是如何工作的

我知道某个地方应该有一个listBoxSRC_SelectedIndexChange,但我一直收到“dict不在此上下文中出现”错误


谢谢

我用一对列表框快速记下了一些东西。只需制作任何表格,其中包含一对列表框,然后将事件连接起来,自己尝试。通过使用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;
        }
    }
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
listBox1.DataSource=新绑定源(新字典
{
{“四条腿哺乳动物”,新名单{“猫”、“狗”、“猪”},
{“两腿哺乳动物”,新名单{“人类”、“黑猩猩”、“类人猿”}
},空);
listBox1.DisplayMember=“值”;
listBox1.ValueMember=“Key”;
}
私有无效列表框1\u SelectedValueChanged(对象发送方,事件参数e)
{
if(listBox1.SelectedItem!=null)
{
var keyValue=(KeyValuePair)listBox1.SelectedItem;
listBox2.DataSource=keyValue.Value;
}
其他的
{
listBox2.DataSource=null;
}
}

您必须在表单范围内声明dict字典(代码隐藏),以便所有事件处理程序都可以查看和访问itI。我遇到问题,当我将SelectedValueChanged代码放入列表框时,第二个列表框中仍然没有数据。您认为这是否意味着原始代码有问题?请澄清,SelectedValueChanged事件代码是否有问题在您的程序中还是在我的示例中?