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){ ...
随机推荐
- 我的Java之旅 第三课 从Applet到JSP
一.Applet Applet是一种特殊的Java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行. App ...
- nginx-1-初识nginx
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...
- SQLite 知识摘要 --- 事务
在许多时候,我们在使用大数据的时候会发现,尽管sqlite数据库的执行效率已经很快了,但是还是满足不了我们的需求,这时候我们会很容易考虑到使用并发的方式去访问sqlite数据库,但是sqlite数据独 ...
- 【Java入门提高篇】Day33 Java容器类详解(十五)PriorityQueue详解
今天要介绍的是基础容器类(为了与并发容器类区分开来而命名的名字)中的另一个成员——PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所耳闻吧,什么?没..没听过?emmm... ...
- JMeter—前置处理器(九)
参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第四节前置处理器前置处理器用来处理请求前的一些准备工作,比如参数设置.环境变变量设置等 一.BeanShell ...
- JMeter—后置处理器(十)
参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第五节后置处理器后置处理器是用来处理采样器发送的请求后得到的响应数据 一.Debug PostProcessor ...
- MSSQL一种取代游标的方案
今天看到一篇文章写的自己整理记录下,据说比用游标快. DECLARE @字段1 数据类型; DECLARE @字段2 数据类型; DECLARE @TMP_WHILE_ID INT; ,),TMP_W ...
- 洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
urllib2 1.简介 urllib2模块定义的函数和类用来获取URL(主要是HTTP的),他提供一些复杂的接口用于处理: 基本认证,重定向,Cookies等.urllib2和urllib差不多,不 ...
- python第三十三天----静态方法、类方法、属性方法
@staticmethod 装饰后,类中的方法转成静态方法 class a: @staticmethod def b(self): print('') 静态方法不可以访问实例变量或类变量,相当于类中的 ...
- 选择is或者as操作符而不是做强制类型转换
无论何时,正确选择使用as运算符进行类型转换.比盲目的强制类型转换更安全,而且在运行时效率更高. 用as和is进行转换时,并不是对所有用户定义的类型都能完成,只是在运行时类型和目标类型匹配时,转换才能 ...