我有一个继承自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
}
谢谢, 罗斯
答案 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
}
奇怪的是,您设置绑定上下文或数据源的顺序似乎并不重要!