我正在使用32行的datagrid,当我尝试使用这个GetCell(28,2)失败时,以及第28-32行也存在同样的问题。
这一个:visualtreehelper.getchildrencount
在上面的第28行返回0。
我发现如果我向下滚动到数据网格上的那些隐藏行,我可以使用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;
}
答案 0 :(得分:1)
默认 UI虚拟化为On Datagrid ,这意味着仅生成可见容器。
如果您想要获取dataGridRow或不可见的单元格,您必须从后面的代码中手动向下滚动到该行,以便生成其容器。 请参阅此文章here以手动将dataGridRow滚动到视图中。
OR
通过在数据网格上将VirtualizingStackPanel.IsVirtualising设置为false,禁用数据网格上的UI虚拟化(如果不想向下滚动)。
<DataGrid VirtualizingStackPanel.IsVirtualizing="False"/>