WPF:获取DataGrid控件单元格DataGridCell

  1. 转载:http://blog.csdn.net/jhqin/article/details/7645357
  2. /* ---------------------------------------------------------- 
  3. 文件名称:DataGridPlus.cs 
  4.  
  5. 作者:秦建辉 
  6.  
  7. MSN:splashcn@msn.com 
  8. QQ:36748897 
  9.  
  10. 博客:http://blog.csdn.net/jhqin 
  11.  
  12. 开发环境: 
  13.     Visual Studio V2010 
  14.     .NET Framework 4 Client Profile 
  15.  
  16. 版本历史: 
  17.     V1.0    2012年06月07日 
  18.             WPF DataGrid控件扩展方法 
  19.  
  20. 参考资料: 
  21.     http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b7299e55-92e2-4a6b-8987-869fef8f22eb/ 
  22. ------------------------------------------------------------ */  
  23. using System.Windows.Controls;  
  24. using System.Windows.Controls.Primitives;  
  25. using System.Windows.Media;  
  26.   
  27. namespace Splash.WPF  
  28. {  
  29.     public static class DataGridPlus  
  30.     {  
  31.         /// <summary>   
  32.         /// 获取DataGrid控件单元格   
  33.         /// </summary>   
  34.         /// <param name="dataGrid">DataGrid控件</param>   
  35.         /// <param name="rowIndex">单元格所在的行号</param>   
  36.         /// <param name="columnIndex">单元格所在的列号</param>   
  37.         /// <returns>指定的单元格</returns>   
  38.         public static DataGridCell GetCell(this DataGrid dataGrid, int rowIndex, int columnIndex)          
  39.         {  
  40.             DataGridRow rowContainer = dataGrid.GetRow(rowIndex);  
  41.             if (rowContainer != null)  
  42.             {  
  43.                 DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);  
  44.                 DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);  
  45.                 if (cell == null)  
  46.                 {  
  47.                     dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[columnIndex]);  
  48.                     cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);  
  49.                 }  
  50.                 return cell;  
  51.             }  
  52.             return null;  
  53.         }  
  54.   
  55.         /// <summary>   
  56.         /// 获取DataGrid的行   
  57.         /// </summary>   
  58.         /// <param name="dataGrid">DataGrid控件</param>   
  59.         /// <param name="rowIndex">DataGrid行号</param>   
  60.         /// <returns>指定的行号</returns>   
  61.         public static DataGridRow GetRow(this DataGrid dataGrid, int rowIndex)          
  62.         {  
  63.             DataGridRow rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);  
  64.             if (rowContainer == null)  
  65.             {  
  66.                 dataGrid.UpdateLayout();  
  67.                 dataGrid.ScrollIntoView(dataGrid.Items[rowIndex]);  
  68.                 rowContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex);  
  69.             }  
  70.             return rowContainer;  
  71.         }  
  72.   
  73.         /// <summary>   
  74.         /// 获取父可视对象中第一个指定类型的子可视对象   
  75.         /// </summary>   
  76.         /// <typeparam name="T">可视对象类型</typeparam>   
  77.         /// <param name="parent">父可视对象</param>   
  78.         /// <returns>第一个指定类型的子可视对象</returns>   
  79.         public static T GetVisualChild<T>(Visual parent) where T : Visual  
  80.         {  
  81.             T child = default(T);  
  82.             int numVisuals = VisualTreeHelper.GetChildrenCount(parent);  
  83.             for (int i = 0; i < numVisuals; i++)  
  84.             {  
  85.                 Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);  
  86.                 child = v as T;  
  87.                 if (child == null)  
  88.                 {  
  89.                     child = GetVisualChild<T>(v);  
  90.                 }  
  91.                 if (child != null)  
  92.                 {  
  93.                     break;  
  94.                 }  
  95.             }  
  96.             return child;  
  97.         }  
  98.     }  
  99. }  
posted @ 2014-10-31 22:01  玖彩技术团队  阅读(6534)  评论(0编辑  收藏  举报
以上只是个人想法和实践经验,如果有文字错误和语法错误,请加以指点! QQ:247039968 emil:wujc@younger.com 无论是美女的歌声,还是鬣狗的狂吠,无论是鳄鱼的眼泪,还是恶狼的嚎叫,都不会使我动摇