WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法
原文:WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法
WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法
最近在做一个项目,其中要用到主从表数据的折叠和隐藏,并且对从表中的数据能够获取和操作,虽然搞了好久,但最终被我推敲出来了,写出来分享一下,让朋友少走弯路,废话不说了,先上效果图:

下面是代码:
| 
 | 
前台    <DataGrid ItemsSource="{Binding}"Name="dataGrid1"MouseUp="dataGrid1_MouseUp"...>   <DataGrid.Columns>                      <DataGridTemplateColumn Width="Auto">                          <DataGridTemplateColumn.CellTemplate>                              <DataTemplate>                                  <Expander Expanded="Expander_Expanded"Collapsed="Expander_Collapsed"/>                              </DataTemplate>                          </DataGridTemplateColumn.CellTemplate>                      </DataGridTemplateColumn>                      <DataGridTextColumn Binding="{Binding Facility_type}"FontSize="22"Header="設備類型"   "120"/>    
                   <DataGridTextColumn  FontSize="22"Header="廠房代碼"Width="85"                    <DataGridTextColumn  FontSize="22" Header="樓層"Width="70"                    <DataGridTextColumn  FontSize="22"  Header="部門名稱"Width="430"                    <DataGridTextColumn Binding="{Binding Count_all}"FontSize="22"   Header="設備總數"  "100"/>    
                   <DataGridTextColumn Binding="{Binding Count_no}"FontSize="25" FontWeight="Bold"   "Red" Header="未使用數量" Width="115"/>                       <DataGridTextColumn Binding="{Binding Count_yes}"FontSize="22" Foreground="Green"  "使用中數量"  Width="115"/>             
                </DataGrid.Columns>                    <DataGrid.RowDetailsTemplate >                       <DataTemplate  >             
                       <DataGrid Name="dataGrid2" Width="1070" SelectedValuePath = "dept_code"IsReadOnly="True"  "None"HorizontalGridLinesBrush="#FFE0E2DF"VerticalGridLinesBrush="#FFE0E2DF"                                 ItemsSource="{Binding Details}"CanUserAddRows="False"SelectionUnit="FullRow" AutoGenerateColumns="False" MouseUp="dataGrid2_MouseUp">                              <DataGrid.Columns>                                  <DataGridTextColumn   Header=""  Width="150"/>                                   <DataGridTextColumn Binding="{Binding building_code}"FontSize="22"Header="廠房代碼" "85"/>    
                               <DataGridTextColumn Binding="{Binding floor}"FontSize="22" Header="樓層" "70"/>    
                               <DataGridTextColumn Binding="{Binding dept_name}"FontSize="22"  Header="部門名稱" "430"/>    
                               <DataGridTextColumn Binding="{Binding count_all}"FontSize="22"   Header="設備總數"  "100"/>    
                               <DataGridTextColumn Binding="{Binding count_no}" FontSize="25" FontWeight="Bold"  "Red" Header="未使用數量" Width="115"                                <DataGridTextColumn Binding="{Binding count_yes}"FontSize="22" Foreground="Green"  "使用中數量"  Width="115"/>                              </DataGrid.Columns>                       </DataTemplate>                   </DataGrid.RowDetailsTemplate>    ...    </DataGrid> | 
下面是后台:
| 
 | 
using System;     
using System.Data;    using System.Windows;    using System.Windows.Input;    using System.Windows.Media;    using System.Windows.Controls;    using System.Collections.ObjectModel;    using System.Windows.Threading;    namespace {         /// <summary>        /// HumanWork.xaml 的交互逻辑        /// </summary>        publicpartialclass FacilitySum:Window        {            public string Company_code;           // public string Select_item;            publicObservableCollection<Facility> Items {get;set; }            privatedelegatevoid ThreadDelegate();//申明一个专用来调用更改线程函数的委托          publicDispatcherTimer ShowTimer;            publicFacilitySum(string company_code)            {                this.Company_code = company_code;                InitializeComponent();                 this.WindowState = WindowState.Maximized;              }                 
        privatevoidWindow_Loaded(object sender, RoutedEventArgs e)            {                //datagrid数据的加载                 Items = new             DataSet dsFacility = newBLL.DSP_FACILITY_USE().GetFacility_status_Sum(Company_code);                DataSet dsFacilityDetail = newBLL.DSP_FACILITY_USE().GetFacility_UseStatus(Company_code);                int count = dsFacility.Tables[0].Rows.Count;                for (inti =0; i < count; i++)                {                     Items.Add(new             }                 dataGrid1.Items.Clear();                 dataGrid1.ItemsSource  = Items;                 dataGrid1.Items.Refresh();                 dataGrid1.SelectedValuePath = "facility_type";               }                 
        //展开,收缩子表的方法             privatevoidExpander_Expanded(object sender, RoutedEventArgs e)            {                DataGridRow row = FindVisualParent<DataGridRow>(sender as Expander);     
            row.DetailsVisibility = System.Windows.Visibility.Visible;            }                                privatevoidExpander_Collapsed(object sender, RoutedEventArgs e)            {                DataGridRow row = FindVisualParent<DataGridRow>(sender as Expander);     
            row.DetailsVisibility = System.Windows.Visibility.Collapsed;            }            publicT FindVisualParent<T>(DependencyObject child) where T : DependencyObject            {                DependencyObject parentObject = VisualTreeHelper.GetParent(child);                if (parentObject == null) returnnull;                T parent = parentObject asT;                if (parent != null)                    return parent;     
            else                return FindVisualParent<T>(parentObject);            }             //下面的方法曾让我教头烂额,感叹微软的控件封装的太牛逼了,处理起来有点变态             /// <summary>            /// 找到行明细中嵌套的控件名称            /// </summary>            /// <typeparam name="T"></typeparam>            /// <param name="parent"></param>            /// <param name="name"></param>            /// <returns></returns>            publicT FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject             {                  if(parent !=null)                 {                     for(inti=0;i<VisualTreeHelper.GetChildrenCount(parent);i++)                    {                        varchild = VisualTreeHelper.GetChild(parent, i)asDependencyObject;                        string controlName=child.GetValue(Control.NameProperty)asstring;                         if(controlName==name)                        {                            returnchild as                     }                        else                    {                            T result=FindVisualChildByName<T>(child,name);                            if(result!=null)                                returnresult;                        }                    }                 }                  return null;             }                 
         //父表的事件处理驱动             privatevoiddataGrid1_MouseUp(object sender, MouseButtonEventArgs e)            {                 if (dataGrid1.CurrentCell.Column !=null&& dataGrid1.CurrentCell.Column.Header!=null)                {                    string facility_type = (dataGrid1.Columns[1].GetCellContent(dataGrid1.CurrentCell.Item)asTextBlock).Text;                   string head = dataGrid1.CurrentCell.Column.Header.ToString();                     //这边可以根据实际写自己的一些方法                 }             }                 
      //字表,也就是rowdetailtemplate中的datagrid 的事件处理方法,其中有调用上面的约束泛型类型的方法。            private void         {                  //下面的两行代码很关键             DataGridRow dgr = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(this.dataGrid1.SelectedIndex);                DataGrid dg= FindVisualChildByName<DataGrid>(dgr, "dataGrid2") asDataGrid;                 //获取鼠标点击的行每一单元格的值                string facility_type = (dataGrid1.Columns[1].GetCellContent(dataGrid1.CurrentCell.Item)asTextBlock).Text;                string building_code = (dg.Columns[1].GetCellContent(dg.CurrentCell.Item)asTextBlock).Text;                string floor = (dg.Columns[2].GetCellContent(dg.CurrentCell.Item)asTextBlock).Text;                string dept_code =dg.SelectedValue.ToString();     
            string head = dg.CurrentCell.Column.Header.ToString();                //获得一些信息后你可以自己写方法实现需要的功能             }         }        // 定义集合类用于存放栏位值        publicclassFacility         {            //static string FACILITY_TYPE;             public string Facility_type{get;set; }            public string Building_code {get;set; }            public string Floor { get; set; }            public string Dept_code {get;set; }            public string Count_all {get;set; }            public string Count_no {get;set; }            public string Count_yes {get;set; }            public ObservableCollection<Facility_Detail> Details {get;set; }            public Facility(string company_code,introw_index,DataSet dsfacilitySum ,DataSet dsFacilityDetail)            {                 
            Facility_type = dsfacilitySum.Tables[0].Rows[row_index]["facility_type"].ToString();                Count_all = dsfacilitySum.Tables[0].Rows[row_index]["count_all"].ToString();                Count_no = dsfacilitySum.Tables[0].Rows[row_index]["count_no"].ToString();                Count_yes = dsfacilitySum.Tables[0].Rows[row_index]["count_yes"].ToString();                Details = new             //详细信息             System.Data.DataTable dtDetail = newSystem.Data.DataTable();                DataRow[] rowDetail = dsFacilityDetail.Tables[0].Select("facility_type='"+ Facility_type +"'");                dtDetail = dsFacilityDetail.Tables[0].Clone();                 foreach (DataRow dr inrowDetail)                 {                     Details.Add(newFacility_Detail()                    {                        facility_type = Facility_type,                        building_code = dr["building_code"].ToString(),                        floor = dr["floor"].ToString(),                        dept_code = dr["dept_code"].ToString(),                        dept_name = dr["dept_name"].ToString(),                        count_all = dr["count_all"].ToString(),                        count_no = dr["count_no"].ToString(),                        count_yes = dr["count_yes"].ToString()                    });                 }             }         }        publicclassFacility_Detail        {  //定义属性         public string facility_type {get;set; }            public string building_code {get;set; }            public string floor { get; set; }            public string dept_code {get;set; }            public string dept_name {get;set; }            public string count_all {get;set; }            public string count_no {get;set; }            public string count_yes {get;set; }        }    } | 
代码虽然很多,但是看下来不觉得繁琐。在这里还要感叹一下,微软的东西,尤其是控件这种东西封装的太死了,你用第三方的控件其实还不如自己写,能明白很多东西。欢迎大家批评指正。
WPF 实现主从的datagrid以及操作rowdetailtemplate 的方法的更多相关文章
- easyui  datagrid 动态操作editor 的方法
		
easyui本身是不提供这么细节的功能的,需要我们自己拓展下: 在easyui.min.js中扩展: $.extend($.fn.datagrid.methods, { addEditor : fun ...
 - WPF+MVVM学习总结 DataGrid简单案例
		
一.WPF概要 WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的 ...
 - MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件
		
原文 MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电 ...
 - WPF DataGrid 列宽填充表格方法
		
WPF中使DataGrid 列宽填充表格方法,设置ColumnWidth属性为ColumnWidth="*"即可. 源码: <DataGrid AutoGenerateCol ...
 - Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
		
Asp.Net MVC +EntityFramework主从表新增编辑操作的实现 对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的.我在网上搜索了很久都 ...
 - WPF Window背景半透明 ,蒙版操作实现
		
原文:WPF Window背景半透明 ,蒙版操作实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/detail ...
 - WPF自定义样式篇-DataGrid
		
WPF自定义样式篇-DataGrid 先上效果图: 样式: <!--DataGrid样式--> <Style TargetType="DataGrid"& ...
 - MVVM框架从WPF移植到UWP遇到的问题和解决方法
		
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
 - 一些ES5的操作数组的方法
		
在ES5规范中新增了不少操作数组的方法,特此罗列一下以备使用 1. forEach循环 有点类似jQuery的each循环 [12,23,36,4,5].forEach(function(v,k){ ...
 
随机推荐
- 动态切换 web 报表中的统计图类型
			
统计图在浏览器端展现时,不同的使用人员对图形的展现形式会有不同的要求,有的需要柱形图.有的想看折线图等,报表支持用户在浏览器端动态的选择统计图类型,关注乾学院,查看具体实现方法动态切换 web 报表中 ...
 - Git 恢复本地误删的文件
			
通过git进行代码管理的项目,如果在本地编辑的过程中误删了某些文件或者文件夹,可以通过git操作来复原. Step 1: git status 查看本地对改动的暂存记录.如下图所示,本人误删了文件夹“ ...
 - MySQL写入用户微信名
			
很简单的需求,将用户微信名写入MySQl即可,但是测试过程中却遇到了问题,微信名中的emoji写入数据库失败.解决步骤如下 1.了解utf8mb4 MySQL从5.5.3版本开始支持utf8mb4编码 ...
 - [20170627]使用TSPITR恢复表空间.txt
			
[20170627]使用TSPITR恢复表空间.txt --//RMAN提供了一种实现所谓TSPITR(Tablespace Point-In-Time Recovery)的技术,通过简单的一个语句, ...
 - SQL    like 模糊查询,  in
			
 [{"互联网":["网络媒体","微博","墨迹天气","河北天气","其他" ...
 - ccf题库中2016年4月2日俄罗斯方块问题
			
题目如下: 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新 ...
 - transition: 0.2s all ease;
			
/* 全部样式 0.2秒 缓动*/ transition: 0.2s all ease;
 - idea+spring-boot+devtools热部署
			
idea+spring-boot+devtools热部署 标签: spring-boot 2017-03-20 14:45 2635人阅读 评论(1) 收藏 举报 分类: spring-boot m ...
 - 服务器出现大量的127.0.0.1:3306  TIME_WAIT连接 解决方法 [转载]
			
netstat -an 192.168.12.13:3306 192.168.12.12:30443 TIME_WAIT 192.168.12.13:3306 192.1 ...
 - Jquery 中 ajaxSubmit使用讲解
			
最近在使用ajaxForm,随便把使用方法记下下来,以便以后回顾. 1 ,引入依赖脚本 <script type="text/javascript" src="/j ...