设置DataGridView的DataSource后,“列”和“行”仍为空

时间:2019-02-17 04:07:42

标签: c# .net winforms data-binding datagridview

我有一个DataTable和一个DataGridView。

我已阅读this answer,但没有DataAdapter,所以无法调用dataAdapter.Update(dataTable);。我还阅读了一些官方文档(例如this),但我不理解。

简化代码:

var dt = new DataTable();

var c1 = new DataColumn("ColumnA", typeof(int))
{
    Caption = "ColumnA"
};

var c2 = new DataColumn("ColumnB", typeof(int))
{
    Caption = "ColumnB"
};

dt.Columns.Add(c1);
dt.Columns.Add(c2);

var dgv = new DataGridView();

var c11 = new DataGridViewTextBoxColumn()
{
    Name = "ColumnA",
    DataPropertyName = "ColumnA"
};

var c21 = new DataGridViewTextBoxColumn()
{
    Name = "ColumnB",
    DataPropertyName = "ColumnB"
};

dgv.Columns.Add(c11);
dgv.Columns.Add(c21);

var bs = new BindingSource();

// I also tried inverting these two lines:
bs.DataSource = dt;
dgv.DataSource = bs;

dt.Rows.Add(100, 100);
dt.Rows.Add(200, 200);

// I also tried putting this line here:
//bs.EndEdit();

// here bs.Count == 2, but dgv.RowCount == 0

1 个答案:

答案 0 :(得分:2)

在添加到容器控件之前,BindingContext中的DataGridView为空,当为控件设置DataSource时,它会检查BindingContext是否为空,但不会在列BindingContext更改为非null值之前,不要添加列和行。

如果这是您要添加到父项的控件,则通过将其添加到父项,您将具有列和行:

this.Controls.Add(dgv);

如果不打算将其添加到容器中,例如,仅出于打印目的,则可以为控件设置BindingContext

dgv.BindingContext = new BindingContext();