Я ввел DataGridView
в моей форме и успешно внедрил VirtualMode
. При этом данные ячейки извлекаются из локального кэша, и при заполнении таблицы / подкачки и т. Д. Все, кажется, работает правильно. Я обрабатываю событие DataGridView.CellValueNeeded
, чтобы заполнить ячейки.
В DataGridView у меня свойство AutoSizeColumnsMode
установлено на DataGridViewAutoSizeColumnsMode.DisplayedCells
. Я заметил, что при использовании VirtualMode DataGridView не соответствует AutoSizeColumnsMode после заполнения ячеек. Я изучил эту статью , но не нашел решения.
В конечном итоге я хотел бы не полагаться на свойство AutoSizeColumnsMode
, а вызывать метод .AutoResizeColumn()
1014 * где-нибудь для изменения размера, поэтому я сначала автоматически изменяю размер столбца, но затем разрешаю пользователь для изменения размера.
Я пробовал следующее с ограниченным успехом или безуспешно:
Установите DataGridView.AutoSizeColumnsMode
на .None
. Тогда по моему
.CellValueNeeded
обработчик
private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
// ... Get cell value from cache
dataGridView.AutoResizeColumn(e.ColumnIndex, DataGridViewAutoSizeColumnMode.DisplayedCells);
}
Это бросает StackOverFlowException
, вероятно, потому что это
многократно повышает .CellValueNeeded
.
Пробовал точно так же, кроме как в .CellFormatting
обработчик события. Получил то же самое StackOverFlowException
.
Пробовал с и без DataGridView.SuspendLayout/ResumeLayout
:
private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
// ... Get cell value from cache
dataGridView.CellValueNeeded -= dataGridView_CellValueNeeded;
dataGridView.AutoResizeColumn(e.ColumnIndex, DataGridViewAutoSizeColumnMode.DisplayedCells);
dataGridView.CellValueNeeded += dataGridView_CellValueNeeded;
}
Это дает все пустые ячейки, поэтому бесполезно.
Этот на самом деле несколько работает, по причине, которую я не понимаю:
private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
// ... Get cell value from cache
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
}
Он корректно изменяет размер столбцов, но кажется странным, что его нужно повторно вызывать для каждого необходимого значения ячейки. Кроме того, я не могу сразу установить его на .None сразу после этого или он снова будет StackOverFlowException
. Таким образом, я не могу позволить пользователю изменять размер столбцов.
Вызов .UpdateCellValue()
, как упомянуто в статье из моего .CellValueNeeded
обработчика бросков, а также StackOverFlowException
.
Так можно ли вызвать .AutoResizeColumn()
где-нибудь, где он не будет поднимать .CellValueNeeded
, пока не переполнится? Поскольку # 4, кажется, обладает способностью выполнять функцию автоматического изменения размера, кажется, что я мог бы также вызвать ее вручную откуда-то.