Почему я должен добавить 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 для сетки.