数据绑定不在Form.Controls集合中的DataGridView控件?

时间:2011-12-01 11:41:41

标签: data-binding datagridview

我有一个继承自DataGridView的自定义控件。它通过一些额外的功能(导出每个单元格的内容)来增强控制。我想使用此功能,但不需要网格本身的UI。

因此,我创建了自定义控件的实例,将DataSource属性设置为DataTable的实例,并且......网格中没有列。我的DataTable有列(和行),AutoGenerateColumns为true,但网格“Columns”集合中没有列。事实上,它的自定义控件在此时变得无关紧要,因为DataGridView控件也是如此。

如果我将网格添加到表单的“Controls”集合中,则数据绑定有效,并且网格包含我的列。

为什么?

  public Form1()
  {
     InitializeComponent();

     DataTable dataTable = new DataTable() { TableName = "Bob" };
     dataTable.Columns.Add("One",typeof(String));
     dataTable.Columns.Add("Two", typeof(String));
     dataTable.Columns.Add("Three", typeof(String));
     dataTable.Rows.Add("a", "b", "c");
     dataTable.Rows.Add("d", "e", "f");
     dataTable.Rows.Add("g", "h", "i");

     DataGridView grid = new DataGridView();

     grid.DataSource = dataTable;
     int n1 = grid.Columns.Count; // returns zero

     this.Controls.Add(grid); // why do I have to do this ?

     grid.DataSource = null;
     grid.DataSource = dataTable;
     int n2 = grid.Columns.Count; // returns three
  }

谢谢, 罗斯

1 个答案:

答案 0 :(得分:3)

David Hall的评论让我看到了here,这让我看到了网格的BindingContext。果然,它是null,但是通过为网格控件创建一个新的BindingContext,将网格绑定到DataTable现在会填充“Columns”集合。

  public Form1()
  {
     InitializeComponent();

     DataTable dataTable = new DataTable() { TableName = "Bob" };
         :

     DataGridView grid = new DataGridView { Name = "Tom" };

     grid.BindingContext = new BindingContext();
     grid.DataSource = dataTable;

     int n1 = grid.Columns.Count; // returns three
  }

奇怪的是,您设置绑定上下文或数据源的顺序似乎并不重要!