天天看點

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> 

 /// <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的執行個體,如有疑問請聯系我。

本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/821469