10.动态生成DataGrid,动态绑定DataGrid模板列

简介:

  在上一节中我们生成了一个未曾排版的DataGrid。本节将为此窗体排版,动态生成多个绑定列,为绑定列的Header计算宽度,使得绑定列能够合理的 占满整个DataGrid。结合上节所述根据XML模板自动生成多个DataGrid,达到动态生成DataGrid,动态排版的目的。

        本节首先引用两个域名空间:

        using System.Windows.Data;
        using System.Text;

        我们贴出生成模板列的关键代码:

 

 
  1. /// <summary> 
  2.   /// 创建DataGridTextColumn模板列 
  3.   /// </summary> 
  4.   /// <param name="columnBindName">需要绑定的字段名</param> 
  5.   /// <param name="columnHeaderName">模板列的Header</param> 
  6.   /// <param name="width">模板列的宽度</param> 
  7.   /// <returns></returns
  8.   public DataGridTextColumn CreateDataGridTextColumn(string columnBindName, string columnHeaderName, double width) 
  9.   { 
  10.       DataGridTextColumn dgtextColumn = new DataGridTextColumn(); 
  11.       dgtextColumn.Binding = new Binding(columnBindName); 
  12.       dgtextColumn.Header = columnHeaderName; 
  13.       dgtextColumn.IsReadOnly = true
  14.       dgtextColumn.Width = new DataGridLength(width); 
  15.       return dgtextColumn; 
  16.   } 

        上面的函数创建了一列DataGridTextColumn,并且设置它绑定的字段、Header、只读和宽度属性。下面我们在贴出一个函数,这个函数计算一串字符串的总字节数(如果占用中文占用2个字节,如果是英文字母占用1个字节):

 

 
  1. /// <summary> 
  2.  /// 字符串长度(按字节算) 
  3.  /// </summary> 
  4.  /// <param name="str"></param> 
  5.  /// <returns></returns
  6.  static int StrLength(string str) 
  7.  { 
  8.      int len = 0; 
  9.      byte[] b; 
  10.  
  11.      for (int i = 0; i < str.Length; i++) 
  12.      { 
  13.          b = Encoding.UTF8.GetBytes(str.Substring(i, 1)); 
  14.          if (b.Length > 1) 
  15.              len += 2; 
  16.          else 
  17.              len++; 
  18.      } 
  19.  
  20.      return len; 
  21.  } 

        下面一段源码开始动态创建DataGrid,设置相应的基本属性。模板列的宽度计算方法是这样的:

        第一、模板的Header显示可以为中文,可以是字符(包括英文字母)。如果是中文占用2个字节,字符占用1个字节,在默认的DataGrid中,我们假 设平均每个字节占用6个像素,那么需要显示的字符的总字节长度乘以6像素即为显示字符所需要的总长。[StrLength(NameLenth) * 6]

        第二、DataGrid的总宽度首先需要减去2个像素(因为DataGrid的左右边框宽度分别为1),再减去显示字符所需要的总长,剩余的就是可自由分 配的长度。把这些长度除以总的字段数即为每个字段可以获得的像素增量。[double Sub = dgrid.Width - StrLength(NameLenth) * 6 - 2;]

        第三、在foreach循环里面每个字段的字节数乘以6,加上我们第二步获取到的每个字段的像素增量,即为当前模板列的宽度。[x + StrLength(gridClass.ShowName) * 6)]

 

 
  1. //动态生成一个DataGrid,并且绑定数据源 
  2. DataGrid dgrid = new DataGrid(); 
  3. dgrid.HorizontalAlignment = HorizontalAlignment.Left
  4. dgrid.VerticalAlignment = VerticalAlignment.Top
  5. dgrid.AutoGenerateColumns = false
  6. dgrid.Margin = new Thickness(20, 5, 0, 0); 
  7. dgrid.Width = 960; 
  8. dgrid.Name = TableName; 
  9. //计算所有的Header字符总长需要占用多少像素,然后用DataGrid的宽度减去这个长度,得到的结果除以总的DataGrid列数即为每列可以获得的列数宽度的增量。 
  10. double Sub = dgrid.Width - StrLength(NameLenth) * 6 - 2; 
  11. double x = Sub / gridClassList.Count
  12. foreach (GridClass gridClass in gridClassList) 
  13. { //循环添加模板列 
  14. dgrid.Columns.Add(CreateDataGridTextColumn(gridClass.Name, gridClass.ShowName, x + StrLength(gridClass.ShowName) * 6)); 
  15. dgrid.ItemsSource = GetEnumerable(dicList).ToDataSource(); 

        到此我们生成了一个自动分配模板列宽度,自动根据XML生成DataGrid的实例,如有疑问请联系我。

        实例采用VS2010+Silverlight 4.0编写,如需源码点击 SLDanamicTextColumn.rar 下载。


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/821469


相关文章
|
前端开发 Java 数据库连接
导出文件:使用Hutool导出数据为Excel文件
导出文件:使用Hutool导出数据为Excel文件
1376 0
导出文件:使用Hutool导出数据为Excel文件
|
9月前
|
机器学习/深度学习 人工智能 编解码
【AI系统】GhostNet 系列
本文介绍了GhostNet系列网络,重点讲解了GhostNet V1和V2的改进。V1提出了Ghost Module,通过廉价操作生成更多特征图,构建轻量级网络。V2在此基础上引入了解耦全连接注意力(DFC)机制,增强了模型捕捉长距离依赖的能力,同时保持了高效的计算性能,特别适合移动设备。文章详细对比了V2与V1的区别,包括结构改进和性能提升。
367 4
【AI系统】GhostNet 系列
|
7月前
|
人工智能 Anolis
活动推荐:2025 RISC-V 生态大会将在北京召开,龙蜥受邀参展
一同探讨行业趋势及合作契机,齐心共筑 RISC-V 的“芯”未来。
|
存储 监控 Linux
在Linux中,可以使用哪个命令查看系统的历史负载?
在Linux中,可以使用哪个命令查看系统的历史负载?
|
Ubuntu 虚拟化 Windows
将Vmware虚拟机磁盘映射到本地实现文件传输
将虚拟机磁盘映射到本地,可以实现文件互传,更方便使用,在开发时可以替代SecureFx等FTP客户端软件
952 0
|
Linux Shell 开发工具
Linux文件内容查看和编辑指南:cat、less、grep等常用命令详解(一)
Linux文件内容查看和编辑指南:cat、less、grep等常用命令详解(一)
2409 0
|
缓存 负载均衡 JavaScript
vue3中正向代理与反向代理
vue3中正向代理与反向代理
253 1
|
Web App开发 缓存
谷歌浏览器(Chrome):前进后退&清除缓存_掌握这几个浏览器快捷键,提高五倍工作效率。
谷歌浏览器(Chrome):前进后退&清除缓存_掌握这几个浏览器快捷键,提高五倍工作效率。
1403 0
|
搜索推荐 机器人
Z-library 稳定访问指南
Z-library 稳定访问指南
|
负载均衡 Java Nacos
restTemplate loadbalance 负载均衡使用demo 案例 原理以及全网最细源码解析
restTemplate loadbalance 负载均衡使用demo 案例 原理以及全网最细源码解析
restTemplate loadbalance 负载均衡使用demo 案例 原理以及全网最细源码解析