【问题标题】:Databinding a DataGridView control which is not in Form.Controls collection?对不在 Form.Controls 集合中的 DataGridView 控件进行数据绑定?
【发布时间】:2012-01-10 13:33:42
【问题描述】:

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

因此,我创建了一个自定义控件的实例,将 DataSource 属性设置为 DataTable 的一个实例,并且...网格中没有列。我的 DataTable 有列 (和行),AutoGenerateColumns 为 true,但网格“列”集合中没有列。在这一点上,它是一个自定义控件这一事实变得无关紧要,因为 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
  }

谢谢, 罗斯

【问题讨论】:

  • 是的......这似乎与该问题重复。但是,仅读取网格 的“句柄”属性(如对该帖子的回答中所建议的) 似乎不会影响绑定列 (在这种情况下)
  • 是的 - 我自己尝试过,但无法成功。就我个人而言,我会退后一步,重新考虑使用 UI 组件进行非 ui 工作。是否可以提取您的逻辑以处理数据源而不是单元格集合?
  • 在一个理想的世界里我会,但在一个有 20 年历史的单一代码库的世界里,一个 5 行的 hack (使用现有的久经考验的组件) 比几百行新的未经测试的代码。还是谢谢。

标签: data-binding datagridview


【解决方案1】:

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
  }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2017-03-22
    • 2012-02-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多