C# WPF visualtreehelper.getchildrencount在datagrid上返回0
我使用的datagrid有32行,当我尝试使用这个GetCell(28,2)时,它失败了,在第28-32行上也有同样的问题 这个: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) {
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 VirtualizingStackPanel.IsVirtualizing="False"/>
Datagrid默认启用虚拟化,这意味着只生成可见的容器,因为您可能不应该首先尝试这种方法,所以您想做什么。如果您想获取不可见的dataGridRow或单元格,您必须从代码隐藏中手动向下滚动到该行,以便生成其容器,或者您必须禁用dataGrid上的UI虚拟化(如果您不想向下滚动)。@RohitVats谢谢!我从代码中手动向下滚动,效果很好。很好,我将转换它。在我的代码上进行一些尝试后,向下滚动似乎效果不太好,但在dataGrid work上禁用UI虚拟化很好。