最近有一个需求,需要根据用户数据动态生成二维数据表,绑定到表格后,用户再次编辑数据,最后再将编辑过的数据,生成类型数据,存入数据库。

仔细分析过后,觉得最适合的方式,莫过于给DataGrid绑定DynamicObj

以下是项目效果

二维表格第一行和第一列第二列均于用户以excel的方式传入

然后再进行编辑和选择。然后再将每行数据转为数据库格式。例如某一行数据如下:

即Dynamic line数据为:

{"parentName": "书法","eventName": "隶书","eventId": 4,"G1": "简单","G1-Check": "True","G2": "简单","G2-Check": "False","G3": "","G3-Check": "True","G4": "","G4-Check": "True"}

根据以上数据,转换为数据库格式

形成数据如下:

[{"parentName": "书法","eventName": "隶书","eventId": 4,"groupId": 1,"remark": "简单"},{"parentName": "书法","eventName": "隶书","eventId": 4,"groupId": 3,"remark": ""},{"parentName": "书法","eventName": "隶书","eventId": 4,"groupId": 4,"remark": ""}
]

MainWindow.xaml

<Window x:Class="testDataGridBindDynamicObj.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:testDataGridBindDynamicObj"mc:Ignorable="d"Title="MainWindow" Height="768" Width="1024"><Grid><Grid.RowDefinitions ><RowDefinition Height="80" /><RowDefinition /></Grid.RowDefinitions><StackPanel Grid.Row="0" HorizontalAlignment="Left"><Button x:Name="btn_ok" Content="点击" Height="50" Width="92" Margin="458,0" Click="btn_ok_Click" /></StackPanel><DataGrid Grid.Row="1"  x:Name="myDataGrid" HorizontalAlignment="Left" Height="474" Margin="10,10,0,0" VerticalAlignment="Top" Width="996" Loaded="myDataGrid_Loaded" /></Grid>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void myDataGrid_Loaded(object sender, RoutedEventArgs e){#region Group数据List<string> workGroups = new List<string>();workGroups.Add("高中组");workGroups.Add("初中组");workGroups.Add("少儿组");workGroups.Add("幼儿组");List<WorkGroup> listMatchGroup = new List<WorkGroup>();int index = 1;workGroups.ForEach(group=> {WorkGroup workgroup = new WorkGroup();workgroup.MatchGroupId = index;workgroup.MatchGroupName = group;listMatchGroup.Add(workgroup);index++;});#endregion#region Event数据List<string> eventInfos = new List<string>();eventInfos.Add("正书");eventInfos.Add("行书");eventInfos.Add("草书");eventInfos.Add("隶书");eventInfos.Add("篆书");eventInfos.Add("石鼓书");eventInfos.Add("竹简书");eventInfos.Add("乙英");eventInfos.Add("曹全");eventInfos.Add("张迁");eventInfos.Add("一级");eventInfos.Add("二级");eventInfos.Add("三级");eventInfos.Add("自选字体");eventInfos.Add("自选内容");eventInfos.Add("诗经");eventInfos.Add("唐诗");eventInfos.Add("宋辞");eventInfos.Add("对联");eventInfos.Add("其他");int eventId = 1;List<EventInfo> listEventInfo = new List<EventInfo>();eventInfos.ForEach(info => {EventInfo infoEvent = new EventInfo();infoEvent.EventName = info;infoEvent.ParentName = "书法";infoEvent.EventId = eventId;listEventInfo.Add(infoEvent);eventId++;});#endregion#region 设计DataGrid样式(并不是指style)//将二维表格样式设计出来var typeDtc = new DataGridTextColumn{Binding = new Binding("parentName"),Header = "类别",IsReadOnly = true};myDataGrid.Columns.Add(typeDtc);var eventDtc = new DataGridTextColumn{Binding = new Binding("eventName"),Header = "项目名称",IsReadOnly = true,Width = 100};myDataGrid.Columns.Add(eventDtc);var eventIdDtc = new DataGridTextColumn {Binding = new Binding("eventId"),Visibility = Visibility.Hidden};listMatchGroup.ForEach(workgroup=> {//分组列var dtc = new DataGridTextColumn{//Binding = new Binding(workgroup.MatchId.ToString()),Binding = new Binding{Path = new PropertyPath($"G{workgroup.MatchGroupId}"),Mode = BindingMode.TwoWay,UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged},Header = workgroup.MatchGroupName,                    Width = 120};myDataGrid.Columns.Add(dtc);//选择列//-------------添加选择列       //--dgrid为DataGrid实例对象,Row_Checked是响应事件。DataGridTemplateColumn dgtc = new DataGridTemplateColumn();dgtc.Header = "选择";DataTemplate dt = new DataTemplate();//定义子元素FrameworkElementFactory fef = new FrameworkElementFactory(typeof(CheckBox));var binding = new Binding {Path = new PropertyPath($"G{workgroup.MatchGroupId}-Check"),Mode = BindingMode.TwoWay,UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};fef.SetValue(CheckBox.IsCheckedProperty, binding);fef.SetValue(CheckBox.ForegroundProperty, Brushes.Red);//关键部分,为每一项添加事件理解AddHandler的用法      //fef.AddHandler(CheckBox.CheckedEvent, new RoutedEventHandler(Cell_Checked));//fef.AddHandler(CheckBox.UncheckedEvent, new RoutedEventHandler(Cell_unChecked));dt.VisualTree = fef;//添加子元素       dgtc.CellTemplate = dt;myDataGrid.Columns.Add(dgtc);});#endregion#region 生成dynamic数据源// ObservableCollection 为了保证实现数据双向绑定,这样用户数据的输入才可以传递到源中ObservableCollection<ExpandoObject> listData = new ObservableCollection<ExpandoObject>();//生成数据源,注意key要与之前设计的DataGrid样式绑定中指定的列名保持一至listEventInfo.ForEach(infoEvent=> {dynamic data = new ExpandoObject();(data as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>("parentName",infoEvent.ParentName));(data as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>("eventName", infoEvent.EventName));(data as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>("eventId", infoEvent.EventId));listMatchGroup.ForEach(group => {(data as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>($"G{group.MatchGroupId}", string.Empty));//check数据(data as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>($"G{group.MatchGroupId}-Check", true));});listData.Add(data);});#endregion#region 绑定数据源//将数据源绑定至DataGridmyDataGrid.ItemsSource = listData;//string line = string.Empty;#endregion}}

至此完成。

总结:绑定dynamic比较灵活好用。在此记录一下

附件为项目源码

https://download.csdn.net/download/yexuanbaby/33361276https://download.csdn.net/download/yexuanbaby/33361276

Wpf DataGrid 绑定Dynamic (二维数据表)相关推荐

  1. 7、Power Map—实例:添加二维数据表以及批注

    再次添加场景,这次我们的目的是找出各个产品销量最高的省份,添加批注. 首先复制场景,去掉时间的条件(这个场景不再重复播放). 添加二维图表. 根据最高销量的省份,添加批注. 其他设置雷同.

  2. 一维二维_Excel二维数据转一维,2种方法轻松搞定

    今天是2020年1月1日,祝各位小伙伴们新年快乐,开心每一天~ 如下所示,左边是二维交叉数据表,我们希望快速转换成右边的一维数据表 如果复制粘贴,效率太低了,今天分享两种方法,实现快速转换 1.pow ...

  3. Excel二维交叉表恢复为一维表

    工作中遇到这样的问题,收到Excel二维交叉表(数据透视表的结果,但已经保存为普通Excel),根据业务需要将其再次恢复为一维表. 如果数据量小的话,简单的复制剪切就可以了,如果数据量大的话,那么太繁 ...

  4. 二维数据热力图的绘制

    热力图绘制 前言 解决思路及步骤 需要的软件工具 具体步骤 写在最后 前言 对于二维数据的分析,热力图是一个比较好的手段,通过填充的颜色能直观看出不同变量对结果的影响规律. 上图是横坐标代表pH值,纵 ...

  5. 用Numpy和Pandas分析二维数据笔记

    用Numpy和Pandas分析二维数据 上节课,我们利用numpy和pandas分析了一维数据.在这节课中,你将学到这两种库的更多特性.并用它们来分析 二维数据,这节课后,你将能够使用pandas重新 ...

  6. ArcGIS Pro如何实现已入库二维数据生成三维模型

    ArcGIS Pro如何实现已入库二维数据生成三维模型 二维要素是否带高程Z判断 如何判断要素是否带有高程Z信息 : 二维要素进行三维的展示 二维要素生成三维模型 常规状态下已入库的数据一般是二维的点 ...

  7. Python一维二维数据的格式化和处理

    本章导言 什么是数据格式化 前言: -学完本章,看待数据会有一种规范/格式化的视角 -方法论:从Python角度理解文件和数据表示 -实践能力:学会编写带有文件输入输出的程序 1. 数据组织的维度 维 ...

  8. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 二维数据的 K-Means 聚类 ) ★

    文章目录 一. K-Means 聚类算法流程 二. 二维数据的 K-Means 聚类 1. 第一次迭代 2. 第二次迭代 参考博客 : [数据挖掘]聚类算法 简介 ( 基于划分的聚类方法 | 基于层次 ...

  9. 【数据挖掘】K-Means 二维数据聚类分析 ( K-Means 迭代总结 | K-Means 初始中心点选择方案 | K-Means 算法优缺点 | K-Means 算法变种 )

    文章目录 K-Means 二维数据 聚类分析 数据样本及聚类要求 二维数据曼哈顿距离计算 K-Means 算法 步骤 第一次迭代 : 步骤 ( 1 ) 中心点初始化 第一次迭代 : 步骤 ( 2 ) ...

最新文章

  1. 在Java程序设计中,设置环境变量path和classpath的作用分别是什么?
  2. App Store应用脱壳
  3. Navigation bar - remove recent object
  4. python format函数实例_python中强大的format函数实例详解
  5. css怎样设置li分栏,css怎么对文字分栏
  6. vc++画线段的函数_专题:精选中考数学压轴题5道,函数综合,内含解题秘籍
  7. iOS:简单使用UIAlertVIew和UIActionSheet
  8. Python实现 N*N 乘法表
  9. 国外英文版云购夺宝网站项目开发制作代码解析
  10. LeetCode-Python-1386. 安排电影院座位(数组)
  11. [天地间]02-瑞士达沃斯小镇
  12. 素数筛——区间段内最小,最大素数,以及这个区间中素数的个数
  13. FYI | OHBM/Brain 会议投稿指北
  14. 图书管理系统(查找图书和输出全部图书)
  15. 初创企业:融资有风险额度需谨慎
  16. 交通行业大数据应用和发展现状
  17. 基于最大熵Maxent-ArcGis地理分布预测教程
  18. IntelliJ IDEA远程调试设置
  19. 学习笔记,神经网络和反向传播
  20. maven工程依赖war包提示Could not find artifact xxxxxxxxx

热门文章

  1. 腾讯音乐事业群 Android 移动客户端面经,成功斩获offer!
  2. IDEA报错 Failed to determine a suitable driver class
  3. Nginx的功能作用
  4. 微信公众号PC端批量取关
  5. mac 隐藏窗口快捷键
  6. 教育行业产品思维导图
  7. flash 与动画:发光
  8. 100分与99分的区别
  9. browserify使用
  10. MATLAB读取.c3d文件