我已经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 似乎能够执行自动调整大小功能,因此我似乎也可以从某个地方手动调用它。