【发布时间】:2012-03-22 02:53:40
【问题描述】:
我在表单上实现了DataGridView,并成功实现了VirtualMode。这会从本地缓存中检索单元格数据,并且在填充网格/分页等时似乎一切正常。我处理 DataGridView.CellValueNeeded 事件来填充单元格。
在 DataGridView 上,我将 AutoSizeColumnsMode 属性设置为 DataGridViewAutoSizeColumnsMode.DisplayedCells。我注意到在使用 VirtualMode 时,DataGridView 在填充单元格后似乎不尊重 AutoSizeColumnsMode。我检查了this article,但没有找到解决方案。
我最终想做的是不依赖AutoSizeColumnsMode 属性,而是调用.AutoResizeColumn() 方法somewhere 来调整大小,所以我最初自动调整列大小,但随后允许用户调整大小。
我尝试了以下方法,但效果有限或没有成功:
-
将
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。因此,我不能允许用户调整列的大小。 如文章中所述,从我的
.CellValueNeeded处理程序调用.UpdateCellValue()也会抛出StackOverFlowException。
那么有没有可能在某个地方调用.AutoResizeColumn(),直到它溢出才会引发.CellValueNeeded?由于#4 似乎能够执行自动调整大小功能,因此我似乎也可以从某个地方手动调用它。
【问题讨论】:
标签: c# winforms datagridview autoresize virtualmode