簡體   English   中英

BindingSource / DataGridView交互

[英]BindingSource/DataGridView interaction

我無法理解為什么我的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);

在Winforms項目中,嘗試使用此代碼(您發布的模擬器和it works ! )然后映射/調試到現有代碼以縮小問題范圍: -

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

因此, to Debug your code 通過映射到上面的 to Debug your code ,您可以刪除這些位 -

 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();

just have this在第一次試驗中just have this -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM