Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGrid中的可见行关闭1(使用ContainerFromItem计数)_C#_.net_Wpf_Datagrid_Off By One - Fatal编程技术网

C# DataGrid中的可见行关闭1(使用ContainerFromItem计数)

C# DataGrid中的可见行关闭1(使用ContainerFromItem计数),c#,.net,wpf,datagrid,off-by-one,C#,.net,Wpf,Datagrid,Off By One,我有一个DataGrid,根据screen-res的不同维度。我需要知道用户可以看到多少行。这是我的密码: uint VisibleRows = 0; var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid"); foreach(var Item in TicketGrid.Items) { var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerF

我有一个
DataGrid
,根据screen-res的不同维度。我需要知道用户可以看到多少行。这是我的密码:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
    var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);
    if(Row != null && Row.IsVisible) {
        VisibleRows++;
    }
}
我使用以下代码来测试VAR:

MessageBox.Show(String.Format("{0} of {1} rows visible", VisibleRows, TicketGrid.Items.Count));
  • 当网格中没有行时,它会正确地显示可见的0行中的0行:

  • 当网格中有1行时,它将正确显示可见的1行中的1行:

  • 当网格中有9行时,将正确显示9行中的9行可见:

  • 下一行是“半可见”,因此我将计算它,显示10行中的10行是正确的:

  • 但是,要添加的下一行明显可见,错误地显示了11行中的11行可见:

  • 在此之后添加的行是正确的(除了1行),例如18行中的11行可见:


我不能只是
-1
,因为只有在添加了某个数字之后,它才是不正确的。我无法检查
>10
,因为尺寸是可变的


我怎样才能解决这个问题呢?

以下是最终对我有效的方法:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
    var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);

    if(Row != null) {
        /*
           This is the magic line! We measure the Y position of the Row, relative to
           the TicketGrid, adding the Row's height. If it exceeds the height of the
           TicketGrid, it ain't visible!
        */

        if(Row.TransformToVisual(TicketGrid).Transform(new Point(0, 0)).Y + Row.ActualHeight >= TicketGrid.ActualHeight) {
            break;
        }

        VisibleRows++;
    }
}
第9行之前(包括第9行)显示9/9可见。“半可见”第10行导致10个可见中的9个可见。实际上,出于我的目的,将此而不是计算为可见行更好,所以这对我来说就足够了!:)


注意:如果您在不使用
中断
的情况下重用我的代码,则有问题的行后面的任何不可见行都将抛出
NullRefException

半可见行后面的行不可用visible@DrKoch这就是重点……你的文字上写着“明显可见”——非常明显confusing@DrKochC#说它是可见的;事实并非如此。它“显然”是可见的,但很抱歉混淆了!:)我找到了解决办法!现在就开始编码吧!:)