wpf 获取datagrid 模板列中的控件
2017-11-23 14:49
489 查看
目前采用的 方法 (网上提供的一款)
public static DataGridRow GetRow(DataGrid datagrid, int columnIndex)
{
DataGridRow row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(columnIndex);
if (row == null)
{
datagrid.UpdateLayout();
datagrid.ScrollIntoView(datagrid.Items[columnIndex]);
row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(columnIndex); //确保这一行出现
}
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;
}
public static DataGridCell GetCell(DataGrid datagrid, int rowIndex, int columnIndex)
{
DataGridCell cell=new DataGridCell ();
try
{
DataGridRow rowContainer = GetRow(datagrid, rowIndex);
if (rowContainer != null)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
//cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
cell = CommonHelper.GetCell(datagrid, rowIndex, 8);
if (cell == null)
{
datagrid.ScrollIntoView(rowContainer, datagrid.Columns[columnIndex]);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
}
return cell;
}
}
catch (Exception ex)
{
}
return cell;
}
public static T FindVisualChildByName<T>(Visual parent, string name) where T : Visual
{
if (parent != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return result;
}
}
}
return null;
}
自己使用的一种方法
string strReportStatus = (dgReportList.Items[i] as DataRowView)["STATUS"].ToString();
DataGridTemplateColumn templeColumn = dgReportList.Columns[8] as DataGridTemplateColumn;
FrameworkElement s = dgReportList.Columns[8].GetCellContent(dgReportList.Items[i]);
TextBlock tbOper = templeColumn.CellTemplate.FindName("blockOper", s) as TextBlock;
当循环到一定的 行时 会报出为空 FrameworkElement s = dgReportList.Columns[8].GetCellContent(dgReportList.Items[i]);
solution:
你的datagrid是默认开启了ui virtualization 的吧,如果是这样的话,VisualTree并不是所有的控件,为了显示加速,virtualization默认的只会加载一定范围的控件,不显示的控件并不加载.
正解!!!!!!!!!!!!! 怒赞!!!!!!!!!!!!!!!!!!!
在datagrid属性里面要关闭就可以了,不过加时间是问题,如果不是分页的话
EnableColumnVirtualization="False"
public static DataGridRow GetRow(DataGrid datagrid, int columnIndex)
{
DataGridRow row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(columnIndex);
if (row == null)
{
datagrid.UpdateLayout();
datagrid.ScrollIntoView(datagrid.Items[columnIndex]);
row = (DataGridRow)datagrid.ItemContainerGenerator.ContainerFromIndex(columnIndex); //确保这一行出现
}
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;
}
public static DataGridCell GetCell(DataGrid datagrid, int rowIndex, int columnIndex)
{
DataGridCell cell=new DataGridCell ();
try
{
DataGridRow rowContainer = GetRow(datagrid, rowIndex);
if (rowContainer != null)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
//cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
cell = CommonHelper.GetCell(datagrid, rowIndex, 8);
if (cell == null)
{
datagrid.ScrollIntoView(rowContainer, datagrid.Columns[columnIndex]);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
}
return cell;
}
}
catch (Exception ex)
{
}
return cell;
}
public static T FindVisualChildByName<T>(Visual parent, string name) where T : Visual
{
if (parent != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return result;
}
}
}
return null;
}
自己使用的一种方法
string strReportStatus = (dgReportList.Items[i] as DataRowView)["STATUS"].ToString();
DataGridTemplateColumn templeColumn = dgReportList.Columns[8] as DataGridTemplateColumn;
FrameworkElement s = dgReportList.Columns[8].GetCellContent(dgReportList.Items[i]);
TextBlock tbOper = templeColumn.CellTemplate.FindName("blockOper", s) as TextBlock;
当循环到一定的 行时 会报出为空 FrameworkElement s = dgReportList.Columns[8].GetCellContent(dgReportList.Items[i]);
solution:
你的datagrid是默认开启了ui virtualization 的吧,如果是这样的话,VisualTree并不是所有的控件,为了显示加速,virtualization默认的只会加载一定范围的控件,不显示的控件并不加载.
正解!!!!!!!!!!!!! 怒赞!!!!!!!!!!!!!!!!!!!
在datagrid属性里面要关闭就可以了,不过加时间是问题,如果不是分页的话
EnableColumnVirtualization="False"
相关文章推荐
- WPF 中获取DataGrid 模板列中控件的对像
- wpf 获取datagrid中模板中控件
- 在WPF中获取DataGridTemplateColumn模板定义的内容控件
- 在WPF中获取DataGridTemplateColumn模板定义的内容控件
- WPF中获取控件默认样式和模板XML
- WPF 获取控件模板中的控件
- wpf 模板内控件在后台CS文件里面获取属性值
- 获取WPF所有控件的模板内容
- WPF DataGridTemplateColumn 获取内部控件
- wpf datagrid 得到模板中的控件
- WPF 4 DataGrid 控件(基本功能篇)
- EasyUI - datagrid中单元格里编辑控件的单击事件如何获取当前行的index
- WPF获取控件坐标
- WPF获取当前用户控件的父窗体
- 编写 WPF DataGrid 列模板,实现更好的用户体验
- CodedUI Test 测试WPF程序,无法获取控件属性值的解决方法
- WPF中的ControlTemplate(控件模板)
- 综合应用WPF/WCF/WF/LINQ之三十九:实现一个简单的DataGrid之获取某格的原始(或当前)行(或列)的Index
- WPF DataGrid 获取选中的当前行某列值
- 【原创】Silverlight DataGrid对核心控件DataGrid的任意单元格进行获取和设置分析。