C# 需要重复呼叫CellValues

C# 需要重复呼叫CellValues,c#,datagridview,C#,Datagridview,我在表单上有一个垂直和水平滚动的DataGridView 我使用虚拟模式,因为底层数据表很大 当我向右滚动时,如果最后一列没有完全显示在视图中,那么我会看到重复调用CellValueRequired 我怎样才能解决这个问题 我的想法: 为什么需要为部分可见的列重复调用CellValueName?也许我能解决这个问题 在CelValueRequired内-我是否可以检测到它部分可见并返回而不进行处理?当我检查单元格值时,“显示”和“可见”都为真 我的代码: private void grid_Da

我在表单上有一个垂直和水平滚动的DataGridView

我使用虚拟模式,因为底层数据表很大

当我向右滚动时,如果最后一列没有完全显示在视图中,那么我会看到重复调用CellValueRequired

我怎样才能解决这个问题

我的想法:

  • 为什么需要为部分可见的列重复调用CellValueName?也许我能解决这个问题

  • 在CelValueRequired内-我是否可以检测到它部分可见并返回而不进行处理?当我检查单元格值时,“显示”和“可见”都为真

  • 我的代码:

    private void grid_Data_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {
         Console.WriteLine("CellValue: " + e.RowIndex + " " + e.ColumnIndex);
         if (e.RowIndex > Grid.Rows.Count - 1)
            return;
         DataGridView gridView = sender as DataGridView;
         e.Value = Grid.Rows[e.RowIndex][e.ColumnIndex];
         gridView.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex).ToString();
    }
    
    编辑1:

    在Digitalsa1nt的回答之后,我找到了解决问题的方法。这很复杂,因为第一列的处理方式与最后一列不同。如果您正在设置行标题,则会有所不同

    在上面的CellValueNeed中,我现在返回以下函数是否为true

        private bool IsPartiallyVisible(DataGridView gridView, DataGridViewCellValueEventArgs e)
        {
            if (gridView.FirstDisplayedScrollingColumnIndex == e.ColumnIndex)
            {
                if (gridView.FirstDisplayedScrollingColumnHiddenWidth != 0)
                {
                    return true;
                }
            }
    
            bool sameWidth = gridView.GetColumnDisplayRectangle(e.ColumnIndex, false).Width == gridView.GetColumnDisplayRectangle(e.ColumnIndex, true).Width;
            return !sameWidth;
        }
    
    查看for
    CellValueRequired
    它读起来就像是一个标准的视觉事件,只要一个单元格变为“可见”就触发,我认为它没有定义用来理解视觉偏好的逻辑。它似乎只是试图为细胞完全进入“视野”做准备。我怀疑任何中间状态都没有暴露出来

    也就是说,有一些建议(回复)和(奇怪的网络博客)提到了使用
    DataGridView.GetColumnDisplayRectangle
    ,目的是确定单元格的矩形是否在屏幕范围内

    以下是web博客中的一个片段:

    调用GetColumnDisplayRectangle的第二个参数 CutOverFlow,这是一个布尔值,用于控制 函数返回完整的列矩形(即使该列为 不完全可见)或仅列矩形的一部分 这是显而易见的

    通过两次调用此方法,一次在CutOverFlow设置为true和 设置为false后,可以创建一个函数来比较 结果,并在列仅部分打开时返回布尔值 可见:

    返回dg.GetColumnDisplayRectangle(columnindex,False)。宽度=\ubr> dg.GetColumnDisplayRectangle(columnindex,True).宽度


    这将允许您在调用
    grid\u Data\u cellValueRequired
    时停止处理,并且根据最后一个单元格位置返回false。

    很高兴答案有用。有时候,复杂是唯一的方法,但这种计算的处理时间应该相当低,我会关注内存使用情况,以防万一,但你应该会没事。CellValueRequired默认情况下不会这样做,这真是奇怪。但是谢谢你的提示。我同意,我记得读过一篇文章讨论了通用windows平台应用程序中的视觉分层,其中讨论了这种情况。这不是一个完美的解释,但他们有理由允许在像你这样的情况下调用它,但就我的一生而言,我记不得了。