Связывание данных с элементом управления DataGridView, которого нет в коллекции Form.Controls?
У меня есть пользовательский элемент управления, который наследует от DataGridView. Он дополняет элемент управления некоторыми дополнительными функциями (которые экспортируют содержимое каждой ячейки). Я хотел бы использовать эту функциональность, но не нужен пользовательский интерфейс самой сетки.
Итак, я создаю экземпляр пользовательского элемента управления, задаю для свойства 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
}
Спасибо росс
1 ответ
Комментарий Дэвида Холла привел меня сюда, что привело меня к изучению BindingContext сетки. Конечно же, он нулевой, но, создав новый BindingContext для элемента управления grid, привязка сетки к 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
}
Любопытно, что порядок установки контекста привязки или источника данных не имеет значения!