我已经DataGridView
在我的表格上实施了 a 并成功实施VirtualMode
。这将从本地缓存中检索单元格数据,并且在填充网格/分页等时一切似乎都正常工作。我处理DataGridView.CellValueNeeded
事件以填充单元格。
在 DataGridView 上,我将AutoSizeColumnsMode
属性设置为DataGridViewAutoSizeColumnsMode.DisplayedCells
. 我注意到在使用 VirtualMode 时,DataGridView 在填充单元格后似乎不尊重 AutoSizeColumnsMode。我已经检查了这篇文章,但没有找到解决方案。
我最终想做的是不依赖该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; }
它正确调整了列的大小,但是必须在所需的每个单元格值上重复调用它似乎很奇怪。另外,我不能立即将其设置为 .None ,否则它会
StackOverFlowException
再次设置。因此,我不能允许用户调整列的大小。.UpdateCellValue()
如文章中所述,从我的处理程序中调用也会.CellValueNeeded
引发StackOverFlowException
。
那么是否有可能在它溢出之前.AutoResizeColumn()
不会引发的地方调用?.CellValueNeeded
由于#4 似乎能够执行自动调整大小功能,因此我似乎也可以从某个地方手动调用它。