积极答复者
winform datagridview 绑定带实体类的IList 问题

问题
答案
-
这样做:
namespace CSharp { public partial class Form1 : Form { List<Product> products = null; List<Category> categories = null; /// <summary> /// 种类表 /// </summary> private class Category { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } /// <summary> /// 产品表 /// </summary> private class Product { public int Id { get; set; } public string Name { get; set; } public Category Category { get; set; } } /// <summary> /// 自生成数据 /// </summary> public Form1() { InitializeComponent(); categories = new List<Category>() { new Category{Id=1,Name="食物",Description="好吃的食物"}, new Category{Id=2,Name="饮料",Description="可口的饮料"} }; products = new List<Product>() { new Product{Id=1,Name="可口可乐",Category=new Category{Id=1,Name="食物",Description="好吃的食物"}}, new Product{Id=2,Name="雪碧",Category=new Category{Id=1,Name="食物",Description="好吃的食物"}}, new Product{Id=3,Name="爆米花",Category=new Category{Id=2,Name="饮料",Description="可口的饮料"}}, new Product{Id=4,Name="巧克力",Category=new Category{Id=2,Name="饮料",Description="可口的饮料"}} }; comboBox1.DataSource = categories; comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "Id"; comboBox1.SelectedIndex = 0; comboBox1_SelectedIndexChanged(null, null); lbdesc.DataBindings.Add("Text", categories, "Description"); } private void Form1_Load(object sender, EventArgs e) { } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { int value = (int)comboBox1.SelectedValue; dataGridView1.DataSource = products.FindAll(p => p.Category.Id == value); dataGridView1.Columns[2].Visible = false; } } }
- 已标记为答案 Lacuz 2012年9月6日 2:12
全部回复
-
通过linq获取匿名实体类集合,然后绑定
List<Product> lst = new List<Product>(); lst.Add(new Product() { ID = 1, Name = "Product1", Category = new Category() { ID = 1, Name = "Category1" } }); lst.Add(new Product() { ID = 2, Name = "Product2", Category = new Category() { ID = 2, Name = "Category2" } }); lst.Add(new Product() { ID = 3, Name = "Product3", Category = new Category() { ID = 3, Name = "Category3" } }); var dataSource = lst.Select(o => new { ID = o.ID, Name = o.Name, CategoryID = o.Category.ID, CategoryName = o.Category.Name }).ToList(); dataGridView1.DataSource = dataSource;
-
通过linq获取匿名实体类集合,然后绑定
List<Product> lst = new List<Product>(); lst.Add(new Product() { ID = 1, Name = "Product1", Category = new Category() { ID = 1, Name = "Category1" } }); lst.Add(new Product() { ID = 2, Name = "Product2", Category = new Category() { ID = 2, Name = "Category2" } }); lst.Add(new Product() { ID = 3, Name = "Product3", Category = new Category() { ID = 3, Name = "Category3" } }); var dataSource = lst.Select(o => new { ID = o.ID, Name = o.Name, CategoryID = o.Category.ID, CategoryName = o.Category.Name }).ToList(); dataGridView1.DataSource = dataSource;
-
通过linq获取匿名实体类集合,然后绑定
List<Product> lst = new List<Product>(); lst.Add(new Product() { ID = 1, Name = "Product1", Category = new Category() { ID = 1, Name = "Category1" } }); lst.Add(new Product() { ID = 2, Name = "Product2", Category = new Category() { ID = 2, Name = "Category2" } }); lst.Add(new Product() { ID = 3, Name = "Product3", Category = new Category() { ID = 3, Name = "Category3" } }); var dataSource = lst.Select(o => new { ID = o.ID, Name = o.Name, CategoryID = o.Category.ID, CategoryName = o.Category.Name }).ToList(); dataGridView1.DataSource = dataSource;
可以看到我的回复中的代码获取的匿名实体类包含了Product的所有属性和Category的所有属性。至于要获取那些字段,完全可以自己取舍。比如:
dataGridView1.Columns[0].DataPropertyName = "ID"; dataGridView1.Columns[1].DataPropertyName = "Name"; dataGridView1.Columns[2].DataPropertyName = "CategoryID"; dataGridView1.Columns[3].DataPropertyName = "CategoryName";
- 已编辑 梁猛 2012年9月5日 8:31
-
通过linq获取匿名实体类集合,然后绑定
List<Product> lst = new List<Product>(); lst.Add(new Product() { ID = 1, Name = "Product1", Category = new Category() { ID = 1, Name = "Category1" } }); lst.Add(new Product() { ID = 2, Name = "Product2", Category = new Category() { ID = 2, Name = "Category2" } }); lst.Add(new Product() { ID = 3, Name = "Product3", Category = new Category() { ID = 3, Name = "Category3" } }); var dataSource = lst.Select(o => new { ID = o.ID, Name = o.Name, CategoryID = o.Category.ID, CategoryName = o.Category.Name }).ToList(); dataGridView1.DataSource = dataSource;
可以看到我的回复中的代码获取的匿名实体类包含了Product的所有属性和Category的所有属性。至于要获取那些字段,完全可以自己取舍。比如:
dataGridView1.Columns[0].DataPropertyName = "ID"; dataGridView1.Columns[1].DataPropertyName = "Name"; dataGridView1.Columns[2].DataPropertyName = "CategoryID"; dataGridView1.Columns[3].DataPropertyName = "CategoryName";
-
这样做:
namespace CSharp { public partial class Form1 : Form { List<Product> products = null; List<Category> categories = null; /// <summary> /// 种类表 /// </summary> private class Category { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } /// <summary> /// 产品表 /// </summary> private class Product { public int Id { get; set; } public string Name { get; set; } public Category Category { get; set; } } /// <summary> /// 自生成数据 /// </summary> public Form1() { InitializeComponent(); categories = new List<Category>() { new Category{Id=1,Name="食物",Description="好吃的食物"}, new Category{Id=2,Name="饮料",Description="可口的饮料"} }; products = new List<Product>() { new Product{Id=1,Name="可口可乐",Category=new Category{Id=1,Name="食物",Description="好吃的食物"}}, new Product{Id=2,Name="雪碧",Category=new Category{Id=1,Name="食物",Description="好吃的食物"}}, new Product{Id=3,Name="爆米花",Category=new Category{Id=2,Name="饮料",Description="可口的饮料"}}, new Product{Id=4,Name="巧克力",Category=new Category{Id=2,Name="饮料",Description="可口的饮料"}} }; comboBox1.DataSource = categories; comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "Id"; comboBox1.SelectedIndex = 0; comboBox1_SelectedIndexChanged(null, null); lbdesc.DataBindings.Add("Text", categories, "Description"); } private void Form1_Load(object sender, EventArgs e) { } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { int value = (int)comboBox1.SelectedValue; dataGridView1.DataSource = products.FindAll(p => p.Category.Id == value); dataGridView1.Columns[2].Visible = false; } } }
- 已标记为答案 Lacuz 2012年9月6日 2:12