WPF获取DataGrid单元格和获取DataGrid行的方法

来源:互联网 发布:约翰威廉姆斯 知乎 编辑:程序博客网 时间:2024/05/16 03:09

原文地址

在WPF中,DataGrid控件并没有提供访问其DataGridRow或者DataGridCell的方法。 

  因此我们需要自己来编写获取的方法,这其中主要用到了ItemsControl类的一个实例方法:ItemContainerGenerator


using System.Windows.Controls;using System.Windows.Controls.Primitives;using System.Windows.Media;namespace Splash.WPF{    public static class DataGridPlus    {        /// <summary>        /// 获取DataGrid控件单元格        /// </summary>        /// <param name="dataGrid">DataGrid控件</param>        /// <param name="rowIndex">单元格所在的行号</param>        /// <param name="columnIndex">单元格所在的列号</param>        /// <returns>指定的单元格</returns>        public static DataGridCell GetCell(this DataGrid dataGrid, int rowIndex, int columnIndex)                {            DataGridRow rowContainer = dataGrid.GetRow(rowIndex);            if (rowContainer != null)            {                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);                if (cell == null)                {                    dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]);                    cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);                }                return cell;            }            return null;        }        /// <summary>        /// 获取DataGrid的行        /// </summary>        /// <param name="dataGrid">DataGrid控件</param>        /// <param name="rowIndex">DataGrid行号</param>        /// <returns>指定的行号</returns>        public static DataGridRow GetRow(this DataGrid dataGrid, int rowIndex)                {            DataGridRow rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);            if (rowContainer == null)            {                dataGrid.UpdateLayout();                dataGrid.ScrollIntoView(dataGrid.Items[rowIndex]);                rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);            }            return rowContainer;        }        /// <summary>        /// 获取父可视对象中第一个指定类型的子可视对象        /// </summary>        /// <typeparam name="T">可视对象类型</typeparam>        /// <param name="parent">父可视对象</param>        /// <returns>第一个指定类型的子可视对象</returns>        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;        }    }}