none
winform datagridview 绑定带实体类的IList 问题 RRS feed

  • 问题

  • IList里面包含实体类

    IList<product> = new List<product>();

    product(id,name,category)

    其中category也是一个实体类型

    category(id,name)

    我用datagridview 绑定IList<product>作为数据源后,怎么显示category里面的name字段呢?



    • 已编辑 Lacuz 2012年9月5日 7:37
    2012年9月5日 7:23

答案

  • 这样做:

    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;
            }
          
        }
    }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 Lacuz 2012年9月6日 2:12
    2012年9月5日 8:53
    版主

全部回复

  • 你可以重写Category的ToString方法,直接返回一个当前Name属性。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月5日 7:54
    版主
  • 返回Name只是一个比方,如果还有别的字段需要显示呢?

    有没办法用“类.属性”的方式显示到DataGridViewTextBoxColumn上去?

    column.DataPropertyName该怎么写?

    • 已编辑 Lacuz 2012年9月5日 7:58
    2012年9月5日 7:56
  • 返回Name只是一个比方,如果还有别的字段需要显示呢

    那你只能在dataGridView中绑定Product所有信息,至于对应的Category是一个导航字段,另外读取显示(无须绑定)。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月5日 7:58
    版主
  • 还有更好的办法吗?对于字段多的表要联合查询,你们都是直接SELECT列出来读取?没有用实体类?

    另外读取显示怎么个实现,能不能写个demo参考下


    • 已编辑 Lacuz 2012年9月5日 8:10
    2012年9月5日 8:08
  • 通过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;

    2012年9月5日 8:17
  • 通过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;

    获取实体类集合绑定到DataGridView 这个我会。问题是绑定到DataGridView上后怎么显示各属性。。
    2012年9月5日 8:27
  • 通过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;

    获取实体类集合绑定到DataGridView 这个我会。问题是绑定到DataGridView上后怎么显示各属性。。

    可以看到我的回复中的代码获取的匿名实体类包含了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
    2012年9月5日 8:29
  • 通过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;

    获取实体类集合绑定到DataGridView 这个我会。问题是绑定到DataGridView上后怎么显示各属性。。

    可以看到我的回复中的代码获取的匿名实体类包含了Product的所有属性和Category的所有属性。至于要获取那些字段,完全可以自己取舍。比如:


    dataGridView1.Columns[0].DataPropertyName = "ID";
    dataGridView1.Columns[1].DataPropertyName = "Name";
    dataGridView1.Columns[2].DataPropertyName = "CategoryID";
    dataGridView1.Columns[3].DataPropertyName = "CategoryName";

    我的list没有.Select方法?
    2012年9月5日 8:38
  • 你这样写和在SQL语句里直接 SELECT p.Id, p.Name, c.id, c.Name 差不多,感觉实体类没有意义了
    2012年9月5日 8:44
  • 这样做:

    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;
            }
          
        }
    }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 Lacuz 2012年9月6日 2:12
    2012年9月5日 8:53
    版主
  • 你这样写和在SQL语句里直接 SELECT p.Id, p.Name, c.id, c.Name 差不多,感觉实体类没有意义了

    实体类是为了编码更加直观方便,并不是万能的,要合理取舍。
    2012年9月5日 9:53
  • BindingSource 能解决这个问题吗?
    2012年9月6日 1:57
  • BindingSource 能解决这个问题吗?

    就这个题目无需BindingSource。因为BindingSource一般用于数据需要修改的情况下作为一个链接使用。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月6日 2:01
    版主