我在表单上实施了DataGridView
并成功实施VirtualMode
。这从本地缓存中检索单元格数据,并且在填充网格/分页等时全部显示正常工作。我处理DataGridView.CellValueNeeded
事件以填充单元格。VirtualMode中的WinForms DataGridView何时调用AutoResizeColumn?
在DataGridView上,我将AutoSizeColumnsMode
属性设置为DataGridViewAutoSizeColumnsMode.DisplayedCells
。我注意到在使用VirtualMode时,在填充单元格后DataGridView看起来并不尊重AutoSizeColumnsMode。我已检查了this article但未找到解决方案。
我最终会做的是不依靠AutoSizeColumnsMode
财产,而是调用.AutoResizeColumn()
方法地方来调整,所以我最初自动调整列,但随后允许用户调整。
我试图用有限的或者没有成功如下:
设置
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; }
它正确地调整大小列,但它似乎很奇怪有反复调用它需要每一个单元格的值。此外,我不能立即将它设置为。无权之后,或将再次
StackOverFlowException
。因此,我不能允许用户调整列的大小。如我在
.CellValueNeeded
处理文章中提到的调用.UpdateCellValue()
也会抛出StackOverFlowException
。
那么,是否可以调用.AutoResizeColumn()
的地方,它不会提高.CellValueNeeded
直到溢出?由于#4似乎有能力执行autosize函数,所以好像我也可以从某处手动调用它。