我使用的是32行数据集,当我尝试使用这个GetCell( 28 ,2)失败时,在第28-32行也存在同样的问题。
这个:当上面的第28行时,visualtreehelper.getchildrencount返回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;
}发布于 2014-02-15 07:09:06
默认情况下,用户界面虚拟化是为数据启动的,这意味着只生成可见的容器。
如果您想获得不可见的dataGridRow或单元格,则必须从后面的代码手动向下滚动到该行,以便生成容器。请参考本文这里手动滚动dataGridRow到视图。
或
在dataGrid上禁用UI虚拟化(万一不想向下滚动),将VirtualizingStackPanel.IsVirtualising设置为false。
<DataGrid VirtualizingStackPanel.IsVirtualizing="False"/>https://stackoverflow.com/questions/21781339
复制相似问题