BindingSource/DataGridView 交互作用

6
我不明白为什么我的DataGridView一直是空的(没有行,没有自动生成的列):
BindingList<MyObject> bList = new BindingList<MyObject>();
 fileStream.Position = 0;
 MyObject.Deserialize(fileStream).ForEach(
     j => bList.Add(j));

 this.bindingSource1.SuspendBinding();

 this.dataGridView1.Columns.Clear();
 this.dataGridView1.AutoGenerateColumns = true;
 this.dataGridView1.Enabled = false;
 this.dataGridView1.Invalidate();
 this.bindingSource1.DataSource = bList;
 this.dataGridView1.DataSource = bindingSource1;
 this.bindingSource1.ResumeBinding();
 this.dataGridView1.Enabled = true;
 this.dataGridView1.Refresh();

其中 MyObject 被定义为

public class MyObject
{
    public DateTime CreationDate;
    public string CreationId;

    public static List<MyObject> Deserialize(Stream s)
    {
        XDocument xml = XDocument.Load(s);

        var ps = from p in xml
                      .Descendants("p")
                      .Descendants("object")
                  select
                      new MyObject
                      {
                          CreationId = p.Attribute("creationid").Value
                      };

        return ps.ToList();
    }

}

此外,如果我明确地设置列如下所示,行将添加到网格中,但它们全部为空。
DataGridViewTextBoxColumn dc = new DataGridViewTextBoxColumn();
            dc.DataPropertyName = "CreationDate";
            dc.HeaderText = "CreationDate";
            dc.Name = "CreationDate";
            dc.Visible = true;
            dc.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            this.dataGridView1.Columns.Add(dc);

            dc = new DataGridViewTextBoxColumn();
            dc.DataPropertyName = "CreationId";
            dc.HeaderText = "CreationId";
            dc.Name = "CreationId";
            dc.Visible = true;
            dc.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            this.dataGridView1.Columns.Add(dc);

仅做快速观察 - 1. 尝试将 'creationid' 重命名为 CreationId,与网格视图的 DataProperty 完全相同,并且对象中缺少 CreationDate - Angshuman Agarwal
上述注释仅在“Autogeneratecolumn”设置为false的情况下有效 --> 场景 - Angshuman Agarwal
错误。creationid 在 XML 中是以那种方式编写的。您的解决方案行不通。 - Mauro
1个回答

7
在Winforms项目中,尝试使用以下代码(类似于您发布的模拟器,而且它有效!),然后将其与现有代码进行映射/调试,以缩小问题范围:
    DataGridView dgv = new DataGridView();
    //Note: AutogenerateColumns is true by default
    BindingSource bs = new BindingSource();
    BindingList<Customer> bList = new BindingList<Customer>();

    // Fill bList with Customers
    bList.Add(new Customer(){Name="John"});

    bs.DataSource = bList;
    dgv.DataSource = bs;

    this.Controls.Add(dgv);
MyObject等价于:-
public class Customer
    {
        public string Name { get; set; }
    }

所以,为了通过映射到上面的代码来调试你的代码,你可以删除这些部分 -
 this.bindingSource1.SuspendBinding();
 this.dataGridView1.Columns.Clear();
 this.dataGridView1.AutoGenerateColumns = true;
 this.dataGridView1.Enabled = false;
 this.dataGridView1.Invalidate();
 this.bindingSource1.ResumeBinding();
 this.dataGridView1.Enabled = true;
 this.dataGridView1.Refresh();

& 只在第一次试验中有这个 -

 this.bindingSource1.DataSource = bList;
 this.dataGridView1.DataSource = bindingSource1;

1
你应该更好地指出我缺少了{get;set;},但对于迅速的答复加一分。 - Mauro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接