【发布时间】: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 (使用现有的久经考验的组件) 比几百行新的未经测试的代码。还是谢谢。