Связывание данных с элементом управления 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
  }

Любопытно, что порядок установки контекста привязки или источника данных не имеет значения!

Другие вопросы по тегам