2009-08-19 22 views

回答

10

您可以將列表添加到數據源,但是您需要做更多的工作才能讓列看起來像您想要的樣子。

我一直都在這樣做,但它有點涉及。請注意,我的示例使用.net 3.5和一些C#3.0功能來簡化它。

首先,這裏是擴展方法我用:

public static T SelectedItem<T>(this DataGrid ctrl) 
    { 
     var cell = ctrl.CurrentCell; 

     var list = (IList<T>)ctrl.DataSource; 

     if (list == null) 
      return default(T); 
     if (list.Count == 0) 
      return default(T); 

     return list[cell.RowNumber]; 
    } 

    private static void AddColumn(this GridColumnStylesCollection list, string header, string columnName, int width) 
    { 
     list.Add(
      new DataGridTextBoxColumn 
      { 
       HeaderText = header, 
       MappingName = columnName, 
       Width = width 
      }); 
     return; 
    } 

    public static void SetColumnStyles<T>(this DataGrid ctrl, T data, params ColumnStyle[] column) where T : class 
    { 
     var ts = new DataGridTableStyle(); 
     ts.MappingName = data.GetType().Name; 

     for (int i = 0; i < column.Length; i++) 
     { 
      var style = column[i]; 
      ts.GridColumnStyles.AddColumn(style.Header, style.Column, style.Width); 
     } 

     ctrl.TableStyles.Clear(); 
     ctrl.TableStyles.Add(ts); 
    } 

而這個小類:

public class ColumnStyle 
{ 
    public string Header { get; private set; } 
    public string Column { get; private set; } 
    public int Width { get; private set; } 

    public ColumnStyle(string header, string column, int width) 
    { 
     Header = header; 
     Column = column; 
     Width = width; 
    } 

    public ColumnStyle(string column, int width) 
    { 
     Column = column; 
     Header = column; 
     Width = width; 
    } 
} 

也就是說設置,這裏是回報:以一個通用的清單,列表的名稱,以及它們的寬度:

public void LoadInventoryList(IList<InventoryItemSmall> list) 
    { 
     inventoryGrid.SuspendLayout(); 

     inventoryGrid.DataSource = list; 
     inventoryGrid.SetColumnStyles(list, new[] 
              { 
               new ColumnStyle("Name", 170), 
               new ColumnStyle("Size", 30), 
               new ColumnStyle("Quantity", 30) 
              }); 
     inventoryGrid.ResumeLayout(); 
    } 
+0

如果我在我的dataso上執行了.ToArray(),我在MappingName上遇到了麻煩它工作正常。 – Dave 2010-12-31 15:17:26

+1

不錯的工作。這爲我節省了很多痛苦 – Andrew 2011-03-30 07:59:00

0

我不認爲有一種將通用列表綁定到數據網格的內置方式。但是,您可以很容易地創建一個從datagrid繼承的UserControl,並覆蓋/重載綁定方法以適應泛型列表。對此的基本方法是從通用列表生成DataTable,並將生成的DataTable綁定到基本數據網格。當然,這種方法是隻讀的。

2

如果您使用3.5或2.0,您可以使用BindingList

相關問題