我在表单上有一个垂直和水平的可滚动DataGridView。
我使用虚拟模式,因为底层datatable是巨大的。
当我向右滚动时,如果最后一列未在视图中完全显示,则会看到对CellValueNeeded的多次调用。
我怎么才能解决这个问题?
我的想法:
我的代码:
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中,如果下面的函数是真的,我现在返回。
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;
}发布于 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。
https://stackoverflow.com/questions/50799100
复制相似问题