gpt4 book ai didi

c# - VirtualMode 中的 Winforms DataGridView 何时调用 AutoResizeColumn?

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:24 27 4
gpt4 key购买 nike

我在我的窗体上实现了一个DataGridView,并成功实现了VirtualMode。这会从本地缓存中检索单元格数据,并且在填充网格/分页等时似乎都正常工作。我处理 DataGridView.CellValueNeeded 事件来填充单元格。

在 DataGridView 上,我将 AutoSizeColumnsMode 属性设置为 DataGridViewAutoSizeColumnsMode.DisplayedCells。我注意到在使用 VirtualMode 时,DataGridView 在填充单元格后似乎不遵守 AutoSizeColumnsMode。我检查了this article但没有找到解决方案。

我最终想做的是不依赖 AutoSizeColumnsMode 属性,而是调用 .AutoResizeColumn() 方法某处调整大小,所以我最初自动调整列的大小,但随后允许用户调整大小。

我尝试了以下方法,但效果有限或没有成功:

  1. 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

  2. 除了在 .CellFormatting 中尝试了完全相同的事情 事件处理程序。得到相同的 StackOverFlowException

  3. 尝试使用和不使用 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;
    }

    这会给出所有空白单元格,所以没有用。

  4. 由于我不明白的原因,这个实际上有点管用:

    private void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {
    // ... Get cell value from cache
    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
    }

    它正确地调整了列的大小,但是必须在每个需要的单元格值上重复调用它似乎很奇怪。此外,我不能立即将其设置为 .None ,否则它将再次 StackOverFlowException 。因此,我不允许用户调整列的大小。

  5. 从我的 .CellValueNeeded 处理程序调用文章中提到的 .UpdateCellValue() 也会抛出 StackOverFlowException

那么是否可以在某个地方调用 .AutoResizeColumn() 直到它溢出时才引发 .CellValueNeeded?由于 #4 似乎具有执行自动调整大小功能的能力,因此我似乎也可以从某个地方手动调用它。

最佳答案

我认为这可能是解决方案,尽管我仍然有兴趣听听其他人的意见。

我继续查看 DataGridView 引发的其他一些事件,并找到了 .RowPostPaint 事件。我创建了以下处理程序:

private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
if (dataGridView.AllowUserToResizeColumns) //So not to run unnecessarily
{
return;
}
var lastIndex = dataGridView.Rows.GetLastRow(DataGridViewElementStates.Displayed);
if (e.RowIndex == lastIndex) //Only do on the last displayed row
{
dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
dataGridView.AllowUserToResizeColumns = true; // User has control from here on
}
}

这完成了在初始数据加载时自动调整列的大小,然后允许用户从那里重新调整大小。它只执行一次,因此比在所需的每个单元格值上都要好得多。我必须在初始数据加载之前设置 dataGridView.AllowUserToResizeColumns = false

这似乎符合要求。用户将在初始加载时看到非常适合的列,并可以从那里进行调整,而且我的大部分数据在行与行之间的长度相当,因此在大多数情况下不应在此之后截断或浪费空间。

关于c# - VirtualMode 中的 Winforms DataGridView 何时调用 AutoResizeColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com