首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复调用CellValueNeeded

重复调用CellValueNeeded
EN

Stack Overflow用户
提问于 2018-06-11 13:38:38
回答 1查看 499关注 0票数 5

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

我使用虚拟模式,因为底层datatable是巨大的。

当我向右滚动时,如果最后一列未在视图中完全显示,则会看到对CellValueNeeded的多次调用。

我怎么才能解决这个问题?

我的想法:

  1. 为什么要反复调用CellValueNeed作为部分可见的列?也许我能解决原因。
  2. 在CelValueNeeded中--我是否可以检测到它是部分可见的,并且不需要处理就返回?当我检查单元格值时,“显示”和“可见”都是正确的。

我的代码:

代码语言:javascript
复制
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();
}

EDIT1:

在Digitalsa1nt的回答之后,我找到了解决这个问题的方法。这很复杂,因为第一列的处理方式与最后一列不同。如果您正在设置RowHeaders,这将产生很大的影响。

在上面的CellValueNeed中,如果下面的函数是真的,我现在返回。

代码语言:javascript
复制
    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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 10:34:22

看看MSDN文档 for CellValueNeeded,它读起来就好像它是一个标准的视觉事件,只要一个单元格变成“可见的”,它就会立即触发,我认为它没有定义它用来理解视觉偏好的逻辑。就好像它试图为细胞成为完全的“视野”做准备。我怀疑任何中间状态都没有暴露出来。

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

这里有一个来自网络博客的片段:

GetColumnDisplayRectangle的第二个参数称为CutOverFlow,它是一个布尔值,它控制函数是返回完整的列矩形(即使该列不是完全可见的)还是只返回列的矩形中可见的部分。 通过两次调用此方法(一次将CutOverFlow设置为true,一次将其设置为false ),您可以创建一个函数,在该列仅部分可见时比较结果并返回布尔值: 返回dg.GetColumnDisplayRectangle(列索引,False).Width =_ Dg.GetColumnDisplayRectangle(列索引,真).Width

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50799100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档