【问题标题】:linking multiple listboxes c#链接多个列表框c#
【发布时间】:2011-09-15 12:05:07
【问题描述】:

我正在尝试为每个类别中的项目创建一个包含类别的列表框和另一个列表框。我希望能够在第一个列表框中选择一个类别,然后第二个列表框将更改为显示该特定类别的项目。它很常见,我相信你能理解我在这里的意思。我一直在寻找它,但不知道如何做到这一点。我暂时创建了 2 个列表框和我想要的值,就是这样。有什么帮助吗?

【问题讨论】:

    标签: c# listbox


    【解决方案1】:

    我创建了一个带有两个列表框 listbox1 和 listbox2 的 winform,这就是我的 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; }
        }
    }
    

    这里是 InitializeComponent() 代码

                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;
    

    【讨论】:

      【解决方案2】:

      工作示例(简化):

      private class CategoryItems
      {
        public string Category { get; set; }
        public string Item { get; set; }
      
        public CategoryItems(string category, string item)
        {
          this.Category = category;
          this.Item = item;
        }
      
        public override string ToString()
        {
          return this.Item;
        }
      }
      
      private List<string> categories = new List<string>();
      private List<CategoryItems> catItems = new List<CategoryItems>();
      
      private void Form1_Load(object sender, EventArgs e)
      {
        categories.Add("Cat 1");
        categories.Add("Cat 2");
      
        catItems.Add(new CategoryItems("Cat 1", "Cat 1 Item 1"));
        catItems.Add(new CategoryItems("Cat 1", "Cat 1 Item 2"));
        catItems.Add(new CategoryItems("Cat 2", "Cat 2 Item 1"));
        catItems.Add(new CategoryItems("Cat 2", "Cat 2 Item 2"));
      
        foreach (string cat in categories)
        {
          listBox1.Items.Add(cat);
        }
        listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
      }
      
      private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
      {
        listBox2.Items.Clear();
      
        foreach (CategoryItems ci in catItems)
        {
          if (ci.Category == listBox1.SelectedItem.ToString())
            listBox2.Items.Add(ci);
        }
      }
      

      【讨论】:

      • 感谢您的示例。我还需要通过代码单独访问该 listbox2 项目并设置它们的内容。通过您的方法,它无法找到 listbox2 中的项目,因为它们只是动态创建的,而不是在代码中设置的。对不起,我的英语不好,我很难解释,但这对你有意义吗?
      • @user933977 我更新了示例。有很多不同的方法可以做到这一点,包括 DataBindings、LINQ 等。你没有提供任何代码来显示你正在处理的数据,所以我试着做一个简单的例子。
      【解决方案3】:
      1. 有一个函数可以根据第一个列表框的内容填充第二个列表框。
      2. 添加第一个列表框更改时的事件,并调用#1中描述的函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2015-04-20
        • 2013-12-26
        相关资源
        最近更新 更多