Почему я должен добавить DataGridView в форму, чтобы получить данные?

Мне пришлось скопировать представление данных в другое, чтобы перебрать его в потоке фонового работника, создав экспорт Excel.

Копия была сделана, чтобы позволить пользователям вносить некоторые изменения в исходное представление данных во время экспорта.

Поэтому я создал новый DataGridView (программно) и поместил копию исходного DataTable в свойство DataSource нового DataGridView. Однако я выяснил, что если я не добавлю представление данных в свойство Controls (list) какой-либо формы, RowCount все равно будет равен 0...

Может кто-то может это объяснить?

Примечание. Копия DataTable - это просто новая DataTable с копией () столбцов.

2 ответа

Решение

Это довольно просто. Когда вы только что создали свой DataGridView (или любой другой элемент управления WinForms или Wpf), он создается только в.Net. Например, для него не создано системное окно. И пока элемент управления находится в этом состоянии, он не применяет никаких привязок в целях оптимизации (почему визуальный контроль должен делать что-либо, пока он невидим?:)). Когда вы добавляете свой элемент управления в видимую форму, элементу управления будет создано системное окно (т. Е. Его свойство Handle будет инициализировано), и он начнет работать, как и ожидалось. Если вы хотите, чтобы какой-либо визуальный элемент управления работал так, как задумано, но не показывает его на самом деле, вам просто нужно прочитать его свойство Handle. Это заставит контроль создать системное окно и полностью инициализировать. Также для WPF это немного сложнее, потому что вы можете получить дескриптор только для оконного элемента управления, и чтобы получить его, вы должны использовать следующий код:

public IntPtr GetWpfWindowHandle(Window w)
{
   var interopHelper = new WindowInteropHelper(w);
   return interopHelper.Handle;
}

Смотрите этот вопрос для ответа. В этом случае простое чтение дескриптора не сработало - мне нужно было назначить BindingContext для сетки.

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