Silverlight实用窍门系列:10.动态生成DataGrid,动态绑定DataGrid模板列【附带实例源码】-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

Silverlight实用窍门系列:10.动态生成DataGrid,动态绑定DataGrid模板列【附带实例源码】

简介:
+关注继续查看

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

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

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

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

复制代码

/// <summary>
/// 创建DataGridTextColumn模板列
/// </summary>
/// <param name="columnBindName">需要绑定的字段名</param>
/// <param name="columnHeaderName">模板列的Header</param>
/// <param name="width">模板列的宽度</param>
/// <returns></returns>
public DataGridTextColumn CreateDataGridTextColumn(string columnBindName, string columnHeaderName, double width)
{
DataGridTextColumn dgtextColumn
= new DataGridTextColumn();
dgtextColumn.Binding
= new Binding(columnBindName);
dgtextColumn.Header
= columnHeaderName;
dgtextColumn.IsReadOnly
= true;
dgtextColumn.Width
= new DataGridLength(width);
return dgtextColumn;
}
复制代码

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

复制代码

/// <summary>
/// 字符串长度(按字节算)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static int StrLength(string str)
{
int len = 0;
byte[] b;

for (int i = 0; i < str.Length; i++)
{
b
= Encoding.UTF8.GetBytes(str.Substring(i, 1));
if (b.Length > 1)
len
+= 2;
else
len
++;
}

return len;
}
复制代码

        下面一段源码开始动态创建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)]

复制代码

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

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

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

2011022220213025.jpg




    本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/02/22/1961382.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
安全管理最佳实践系列:给ECS实例配置一个RAM角色身份(使用动态STS-Token访问云服务API)
如果你的应用程序部署在ECS实例中,你可能会苦恼于应用程序的AK配置安全问题及管理难的问题。为此阿里云提供了给ECS实例配置RAM角色的解决方案,使得运行ECS实例中的应用程序将不再需要配置AK,而只需要从ECS Metadata服务中获取StsToken就可以访问阿里云服务API,让你不再担心应用程序的AK配置安全问题和难管理的问题。
6704 0
JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块
JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 一.this关键字 用于区分局部变量和成员变量同名的情况 this的特点 this就代表本类对象 这在我们的set方法里面是有的 public void setName(String name) { this.
1093 0
FreeMarker之根据模板生成Java代码
FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码"。 比如Java中三层架构,数据访问层,业务逻辑层,表现层,光这三层就出现重复性的增删改查及其相关的界面代码。
2061 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载