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