【问题标题】:Binding to DataGridView with an array of properties使用一组属性绑定到 DataGridView
【发布时间】:2012-10-15 01:47:19
【问题描述】:

想象一个具有三个属性的类Item

  • 项目名称(字符串)
  • 数量(整数)
  • Price(ItemPrice 类的数组/列表,具有两个属性:VendorName 和 Price)。

基本上,我想将此类绑定到 DataGridView,其中每一行都属于 Item 类。问题是,有不同数量的供应商(或可以稍后编辑),数据绑定必须支持这种动态数量的供应商。

另外,作为奖励,我想添加一个额外的列,显示供应商的价格乘以数量。

我确实想使用虚拟模式(这就是我目前完成这项任务的方式)。

谢谢!

【问题讨论】:

  • 您需要能够编辑价目表,还是只显示它?
  • 是的,我也需要编辑。应该是双向绑定。

标签: c# data-binding datagridview


【解决方案1】:

您可以将表映射到动态创建的 datagridview。 这是一个示例代码sn-p:

    public class ItemBinding
       {
        List<Item> itemList = new List<Item>();
        Item it = null;
        DataRow dr = null;
        public void mapping()
          {
                  for (int i = 0; i <= 4; i++)
                     {
                      it = new Item();
                      it.qty = i;
                      it.name = "name" + i;
                      it.itemprice.Vendorname="vendor" + i;
                      it.itemprice.price = 20 * i;
                      itemList.Add(it);
                     }
          }
         public void binding()
         {
              DataTable dt = new DataTable();

                   dt.Columns.Add(new DataColumn("item", typeof(string)));
                   dt.Columns.Add(new DataColumn("quantity", typeof(int)));
                   dt.Columns.Add(new DataColumn("vendor", typeof(string)));

              //item list contains the detail of the class

                    foreach (Item c in itemList)
                         {
                            dr = dt.NewRow();

                            dr[0] = c.qty;
                            dr[1] = c.name;
                            dr[2] = c.itemprice.Vendorname;;
                            dt.Rows.Add(dr);
                          }
                  dataGridView1.AutoGenerateColumns = true;
                  dataGridView1.DataSource = dt;
                   }
          }
    public class Item
         {
            public int qty{ get; set; }
            public string name { get; set; }
            public ItemPrice itemprice { get; set; }
            public Item()
                 {
                   this.itemprice = new ItemPrice();
                  }
         }

          public class ItemPrice
            {
             public string Vendorname { get; set; }      
             public int price { get; set; }
            }

在这种情况下 itemprice 是一个有两个嵌套的属性或者你可以继承它。 这可能会对你有所帮助。

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是在 Item 类(或新类或匿名类)上创建一个字符串属性,并实现此属性以将所有供应商和商品价格连接在一起。

    这样做的缺点是,将字符串中的所有项目放在同一列中可能看起来很难看,并且无法以直观的方式编辑项目。

    但是,它会实现显示任意数量的供应商和价格的目标,您可以轻松地将供应商价格乘以数量添加到此。

    【讨论】:

    • 不幸的是,这不是一个选项。所有值都必须在各自的列中。
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多