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


    上节内容提要:在实际项目中,我们可能会遇到用户自定义XML模板字段,根据这个模板上的字段来显示相应的字段的值到DataGrid。在这种情况下,需要
    使用XmlReader解析获取这个用户自定义的XML模板上有哪些字段,根据这个字段动态的生成一个实体类,之后再为此动态生成的实体类实例化...

            在上一节中我们生成了一个未曾排版的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 下载。

  • 相关阅读:
    字符串序列处理
    51nod1065 最小正子段和
    51nod1043 幸运号码
    51nod1035 最长的循环节
    51nod 1021 石子归并
    POJ 2387 Til the Cows Come Home
    第一次博客作业
    Python命令行参数以及文件读入写出
    团队介绍及选题报告
    结对编程作业
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1961382.html
Copyright © 2020-2023  润新知