链接多个列表框c#

链接多个列表框c#,c#,listbox,C#,Listbox,我试图创建一个包含类别的列表框,并为每个类别中的项目创建另一个列表框。我希望能够在第一个列表框中选择一个类别,然后第二个列表框将更改为显示该特定类别的项目。这很常见,我相信你能理解我在这里的意思。我四处寻找,但不知道怎么做。我现在已经创建了两个列表框,以及我想要的值,就是这样。有什么帮助吗 具有基于第一个列表框的内容填充第二个列表框的函数 为第一个列表框更改时添加事件,并调用#1中描述的函数 工作示例(简化): 私有类类别项 { 公共字符串类别{get;set;} 公共字符串项{get;set;

我试图创建一个包含类别的列表框,并为每个类别中的项目创建另一个列表框。我希望能够在第一个列表框中选择一个类别,然后第二个列表框将更改为显示该特定类别的项目。这很常见,我相信你能理解我在这里的意思。我四处寻找,但不知道怎么做。我现在已经创建了两个列表框,以及我想要的值,就是这样。有什么帮助吗

  • 具有基于第一个列表框的内容填充第二个列表框的函数
  • 为第一个列表框更改时添加事件,并调用#1中描述的函数
  • 工作示例(简化):

    私有类类别项
    {
    公共字符串类别{get;set;}
    公共字符串项{get;set;}
    公共类别项(字符串类别、字符串项)
    {
    这个。类别=类别;
    此项=项;
    }
    公共重写字符串ToString()
    {
    归还此物品;
    }
    }
    私有列表类别=新列表();
    私有列表catItems=新列表();
    私有void Form1\u加载(对象发送方、事件参数e)
    {
    类别。添加(“第1类”);
    类别。添加(“第2类”);
    增加(新类别项目(“1类”、“1类项目1”);
    增加(新类别项目(“第1类”、“第1类项目2”);
    增加(新类别项目(“第2类”、“第2类项目1”);
    增加(新类别项目(“第2类”、“第2类项目2”);
    foreach(类别中的字符串cat)
    {
    列表框1.Items.Add(cat);
    }
    listBox1.SelectedIndexChanged+=新事件处理程序(listBox1\u SelectedIndexChanged);
    }
    私有无效列表框1\u SelectedIndexChanged(对象发送方,事件参数e)
    {
    listBox2.Items.Clear();
    foreach(CategoryItems ci在catItems中)
    {
    如果(ci.Category==listBox1.SelectedItem.ToString())
    列表框2.Items.Add(ci);
    }
    }
    
    我创建了一个winform,其中包含两个列表框listbox1和listbox2,这就是我的Form1.cs的外观

    namespace WinFormsApp
    {
        public partial class Form1 : Form
        {
            private List<Category> categories;
    
            public Form1()
            {
                InitializeComponent();
    
                categories = new List<Category>();
    
                var categoryOne = new Category { Name = "Category 1"} ;
                categoryOne.Items.Add( new CategoryItem { Name = "Item 1"} );
    
                var categoryTwo = new Category { Name = "Category 2" };
                categoryTwo.Items.Add( new CategoryItem { Name = "Item 2" } );
    
                categories.Add( categoryOne );
                categories.Add( categoryTwo );
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
                categoryBindingSource.DataSource = categories;
            }
        }
    
        public class Category
        {
            public string Name { get; set; }
    
            public List<CategoryItem> Items { get; private set; }
    
            public Category()
            {
                Items = new List<CategoryItem>();
            }
        }
    
        public class CategoryItem
        {
            public string Name { get; set; }
        }
    }
    

    谢谢你的例子。我还需要通过代码单独访问listbox2项,并设置它们的内容。通过您的方法,它无法在listbox2中找到项,因为它们只是动态创建的,而不是在代码中设置的。对不起,我的英语不好,很难解释,但这对你有意义吗?@user933977我更新了示例。有很多不同的方法可以做到这一点,包括数据绑定、LINQ等。您没有提供任何代码来显示您正在处理的数据,因此我尝试制作一个简单的示例。
    namespace WinFormsApp
    {
        public partial class Form1 : Form
        {
            private List<Category> categories;
    
            public Form1()
            {
                InitializeComponent();
    
                categories = new List<Category>();
    
                var categoryOne = new Category { Name = "Category 1"} ;
                categoryOne.Items.Add( new CategoryItem { Name = "Item 1"} );
    
                var categoryTwo = new Category { Name = "Category 2" };
                categoryTwo.Items.Add( new CategoryItem { Name = "Item 2" } );
    
                categories.Add( categoryOne );
                categories.Add( categoryTwo );
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
                categoryBindingSource.DataSource = categories;
            }
        }
    
        public class Category
        {
            public string Name { get; set; }
    
            public List<CategoryItem> Items { get; private set; }
    
            public Category()
            {
                Items = new List<CategoryItem>();
            }
        }
    
        public class CategoryItem
        {
            public string Name { get; set; }
        }
    }
    
                this.listBox1.DataSource = this.categoryBindingSource;
                this.listBox1.DisplayMember = "Name";
                this.listBox1.FormattingEnabled = true;
                this.listBox1.Location = new System.Drawing.Point(24, 24);
                this.listBox1.Name = "listBox1";
                this.listBox1.Size = new System.Drawing.Size(242, 238);
                this.listBox1.TabIndex = 0;
                this.listBox1.ValueMember = "Items";
    
                this.categoryBindingSource.DataSource = typeof(Category);
    
                this.listBox2.DataSource = this.itemsBindingSource;
                this.listBox2.FormattingEnabled = true;
                this.listBox2.Location = new System.Drawing.Point(286, 24);
                this.listBox2.Name = "listBox2";
                this.listBox2.Size = new System.Drawing.Size(276, 238);
                this.listBox2.TabIndex = 1;
                this.listBox2.ValueMember = "Name";
    
                this.itemsBindingSource.DataMember = "Items";
                this.itemsBindingSource.DataSource = this.categoryBindingSource;