2009-08-19 45 views
4

最新の.netコンパクトフレームワークを使用して小さなvbアプリケーションを構築しています。 DataGridコントロールは、私が慣れていたより少し制限があります。Windows Mobile/.Net Compact Framework - ジェネリックリストをDataGridにバインドする方法

グリッドのデータソースをデータセット/データテーブルにバインドできる例がたくさんあります。ジェネリックリストにバインドすることは可能ですか?もしそうなら、どうですか?

答えて

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

+1

素敵な仕事。これは私に痛みをたくさん救った – Andrew

0

一般的なリストをデータグリッドにバインドする組み込みの方法はないと思います。ただし、DataGridから継承するUserControlを簡単に作成し、バインディングメソッドをオーバーライド/オーバーロードして汎用リストに対応できます。これに対する基本的なアプローチは、汎用リストからDataTableを生成し、生成されたDataTableを基本DataGridにバインドすることです。もちろん、このアプローチは読み取り専用です。

2

3.5または2.0を使用している場合はBindingListを使用できます。

関連する問題