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

Data binding 数据绑定不在Form.Controls集合中的DataGridView控件?,data-binding,datagridview,Data Binding,Datagridview,我有一个从DataGridView继承的自定义控件。它通过一些附加功能(导出每个单元格的内容)来增强控件。我想使用这个功能,但不需要网格本身的UI 因此,我创建了自定义控件的一个实例,将DataSource属性设置为DataTable的一个实例,然后。。。网格中没有列。我的DataTable有列(和行),AutoGenerateColumns为true,但网格“columns”集合中没有列。此时,它是一个自定义控件这一事实变得无关紧要,因为DataGridView控件也这样做 如果我将网格添加到

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

因此,我创建了自定义控件的一个实例,将DataSource属性设置为DataTable的一个实例,然后。。。网格中没有列。我的DataTable有列(和行),AutoGenerateColumns为true,但网格“columns”集合中没有列。此时,它是一个自定义控件这一事实变得无关紧要,因为DataGridView控件也这样做

如果我将网格添加到表单的“控件”集合中,那么数据绑定就会起作用,网格就会有我的列

为什么呢

  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
  }
谢谢,
Ross

David Hall的评论让我想到了,这让我研究了网格的绑定上下文。当然,它是空的,但是通过为网格控件创建新的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
  }

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

可能重复的是。。。这似乎是那个问题的重复。然而,仅仅阅读网格的“Handle”属性(正如在对该帖子的回答中所建议的那样)似乎不会影响绑定列(在本例中)。是的,我自己也尝试过,但没有成功。就我个人而言,我会退后一步,重新考虑在非UI工作中使用UI组件。是否有可能提取您的逻辑来处理数据源而不是单元集合?在一个理想的世界中,我会这样做,但在一个有20年历史的单片代码库的世界中,一个5行黑客(使用现有的经过测试的组件)比几百行新的未经测试的代码要好。无论如何,谢谢你。