2009-08-19 129 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

相关问题