Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# WPF visualtreehelper.getchildrencount在datagrid上返回0_C#_Wpf_Datagrid_Visualtreehelper - Fatal编程技术网

C# WPF visualtreehelper.getchildrencount在datagrid上返回0

C# WPF visualtreehelper.getchildrencount在datagrid上返回0,c#,wpf,datagrid,visualtreehelper,C#,Wpf,Datagrid,Visualtreehelper,我使用的datagrid有32行,当我尝试使用这个GetCell(28,2)时,它失败了,在第28-32行上也有同样的问题 这个:visualtreehelper.getchildrencount在第28行上方时返回0 我发现,如果我向下滚动到datagrid上的那些隐藏行,我可以使用GetCell()获得这些行,并且工作正常 我怎么能在没有滚下来的情况下做到这一点 public DataGridCell GetCell(int row, int column) {

我使用的datagrid有32行,当我尝试使用这个GetCell(28,2)时,它失败了,在第28-32行上也有同样的问题

这个:
visualtreehelper.getchildrencount
在第28行上方时返回0

我发现,如果我向下滚动到datagrid上的那些隐藏行,我可以使用GetCell()获得这些行,并且工作正常

我怎么能在没有滚下来的情况下做到这一点

    public DataGridCell GetCell(int row, int column)
    {
        DataGridRow rowContainer = GetRow(row);

        if (rowContainer != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
            if (cell == null)
            {
                datagrid_arinc_const.ScrollIntoView(rowContainer, datagrid_arinc_const.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
        }
        return null;
    }

    public DataGridRow GetRow(int index)
    {
        DataGridRow row = (DataGridRow)datagrid_arinc_const.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            datagrid_arinc_const.UpdateLayout();
            datagrid_arinc_const.ScrollIntoView(datagrid_arinc_const.Items[index]);
            row = (DataGridRow)datagrid_arinc_const.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }

    public static T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }
公共DataGridCell GetCell(int行,int列) { DataGridRow rowContainer=GetRow(行); if(rowContainer!=null) { DataGridCellsPresenter=GetVisualChild(行容器); DataGridCell=(DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(列); if(单元格==null) { datagrid_arinc_const.ScrollintView(行容器、datagrid_arinc_const.Columns[列]); 单元格=(DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(列); } 返回单元; } 返回null; } 公共DataGridRow GetRow(int索引) { DataGridRow行=(DataGridRow)datagrid\u arinc\u const.ItemContainerGenerator.ContainerFromIndex(索引); if(行==null) { datagrid_arinc_const.UpdateLayout(); 数据网格常数滚动视图(数据网格常数项[索引]); 行=(DataGridRow)datagrid\u arinc\u const.ItemContainerGenerator.ContainerFromIndex(索引); } 返回行; } 公共静态T GetVisualChild(可视父级),其中T:VisualChild { T child=默认值(T); int numVisuals=VisualTreeHelper.GetChildrenCount(父级); 对于(int i=0;i默认情况下,Datagrid的UI虚拟化处于启用状态,这意味着只生成可见的容器

如果要获取不可见的dataGridRow或单元格,则必须从代码隐藏中手动向下滚动到该行,以便生成其容器。 请参阅本文,手动将dataGridRow滚动到视图中

通过在dataGrid上设置为false,禁用dataGrid上的UI虚拟化关闭(以防不想向下滚动)

<DataGrid VirtualizingStackPanel.IsVirtualizing="False"/>


Datagrid默认启用虚拟化,这意味着只生成可见的容器,因为您可能不应该首先尝试这种方法,所以您想做什么。如果您想获取不可见的dataGridRow或单元格,您必须从代码隐藏中手动向下滚动到该行,以便生成其容器,或者您必须禁用dataGrid上的UI虚拟化(如果您不想向下滚动)。@RohitVats谢谢!我从代码中手动向下滚动,效果很好。很好,我将转换它。在我的代码上进行一些尝试后,向下滚动似乎效果不太好,但在dataGrid work上禁用UI虚拟化很好。