【问题标题】:C# Tutorial - Binding a DataGridView to a Collection which contains an objectC# 教程 - 将 DataGridView 绑定到包含对象的集合
【发布时间】:2009-12-03 17:26:15
【问题描述】:

所以我有一个数据网格视图。

通常我可以创建对象的绑定列表,它会正确显示所有数据和列

例如

BindingList<Customer> CustomerList = new BindingList<Customer>();
myDataGridView.DataSource = CustomerList;

它会为 Customer 中具有 getter 的每个属性显示一列。 它还将为每个对象显示一行。

完美的结果。

现在在我当前的场景中,我有这些对象:

public class Reservedele
{
    public int Rnr { get; private set;}
    public string Navn { get; private set;}
    public double Pris { get; private set;}
    public string Type { get; private set;}

    public Reservedele(int rnr, string navn, double pris, string type)
    {
        Rnr = rnr;
        Navn = navn;
        Pris = pris;
        Type = type;
    }
}
public class IndkøbsKurvReservedele
{
    public Reservedele Reservedel  { get; private set;}
    public int Antal { get; private set; }
    public double Pris { get; private set; }

    public IndkøbsKurvReservedele(Reservedele reservedel, int antal, double pris)
    {
        Reservedel = reservedel;
        Antal = antal;
        Pris = pris;
    }
}

如果我这样做:

BindingList<IndkøbsKurvReservedele> ReserveDeleListeIndKøbsKurv = new BindingList<IndkøbsKurvReservedele>();
myDataGridView.DataSource = ReserveDeleListeIndKøbsKurv;

它不会工作:( 错误是datagridview显示:

  • 对象本身
  • 安塔尔
  • 普里斯

示例:

如何指示 datagridview 我希望它具有来自 Reservedel 的属性,然后是 IndkøbsKurvReservedele 中的属性作为标题??

作为参考,Reservedel 的意思是“备件”,IndkøbsKurvReservedel 的意思是“ShoppingBasketOfSpareParts”。 Antal的意思是“数量”,就像有多少一样。 对不起,外部变量命名。

编辑:我还有一个问题:如何使Rnr 属性不显示为列?

【问题讨论】:

    标签: c# data-binding


    【解决方案1】:

    技术上你不能,数据源不绑定任何嵌套属性。

    但您始终可以通过在父对象中公开子对象的属性来解决问题。

    【讨论】:

      【解决方案2】:

      您还可以覆盖 Reservedele 类的 ToString() 方法以显示您想要的任何内容(默认情况下,DataGridView 将调用 ToString() 方法来获取单元格内容)。

      【讨论】:

      • 真的吗?字符串()?我不知道。但是它如何将字符串分成 Coloumns 呢?它用什么做分隔符?
      • 在暴露的问题中,您将列与对象属性绑定。此属性可以是本机类型(字符串、整数、双精度等)或对象。如果属性是对象,则调用 ToString() 方法来填充单元格文本。因此,如果您重写此方法以返回“It Works”,则绑定到对象属性的单元格内容将看起来像“It Works”。所以你不会将字符串分成列,这已经在设计时完成了......你明白了吗?如果你愿意,我可以给你一个例子。
      • 好的。想象一下这两个类: public class Parent { public string Name{get;set;} public Child Child{get;set;} } public class Child { public string Name{get;set;} public override string ToString() { return Name .ToString();现在我们将父对象列表绑定到 DataGridView: void F_Load(object sender, EventArgs e) { List p = new List(); p.Add(new Parent(){Name="Parent1",Child=new Child(){Name="Child1"}}); //添加更多孩子 dtGrid.DataSource= p;您会看到“Name”和“Child”两列,子列的内容将为Child#
      【解决方案3】:

      您总是可以使用 LINQ 并执行以下操作:

      var bindMe =
                  from r in ReserveDeleListeIndKøbsKurv
                  select new
                  {
                      navn = r.Reservedel.Navn,
              pris = r.Reservedel.Pris,
              type = r.Reservedel.Type,
              antal = r.Antal,
              anotherPris = r.Pris
                  };
      

      myDataGridView.DataSource = bindMe;

      【讨论】:

      • 但这与绑定列表的效果不同,对吗?当列表中发生更改时,datagrid 必须自行更新。
      【解决方案4】:

      除非您继承该类或将所有这些数据包装到某种数据集中,否则您不能。我不知道您的班级之间的关系或它们如何组合在一起。根据您给我们的当前帖子,这是不可能的。

      还有,你怎么敢把变量当作外来词! :) 开玩笑的

      【讨论】:

        【解决方案5】:

        这是我的解决方案:

        public class IndkøbsKurvReservedele
        {
            //public Reservedele Reservedel  { get; private set;}
            private int Rnr;
            public string Navn { get; private set; }
            public double Pris { get; private set; }
            public string Type { get; private set; }
            public int Antal { get; private set; }
            public double SPris { get; private set; }
        
            public IndkøbsKurvReservedele(Reservedele reservedel, int antal, double sPris)
            {
                Rnr = reservedel.Rnr;
                Navn = reservedel.Navn;
                Pris = reservedel.Pris;
                Type = reservedel.Type;
                Antal = antal;
                SPris = sPris;
            }
            public int HenrReservedelsNummer()
            {
                return Rnr;
            }
        }
        

        如果有人创造了更好的。我会接受他们的。

        【讨论】:

          猜你喜欢
          • 2012-03-27
          • 2012-02-17
          • 2017-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 1970-01-01
          • 2013-05-28
          相关资源
          最近更新 更多