最新の.netコンパクトフレームワークを使用して小さなvbアプリケーションを構築しています。 DataGridコントロールは、私が慣れていたより少し制限があります。Windows Mobile/.Net Compact Framework - ジェネリックリストをDataGridにバインドする方法
グリッドのデータソースをデータセット/データテーブルにバインドできる例がたくさんあります。ジェネリックリストにバインドすることは可能ですか?もしそうなら、どうですか?
最新の.netコンパクトフレームワークを使用して小さなvbアプリケーションを構築しています。 DataGridコントロールは、私が慣れていたより少し制限があります。Windows Mobile/.Net Compact Framework - ジェネリックリストをDataGridにバインドする方法
グリッドのデータソースをデータセット/データテーブルにバインドできる例がたくさんあります。ジェネリックリストにバインドすることは可能ですか?もしそうなら、どうですか?
データソースにリストを追加するだけで済みますが、列を希望通りに表示するには、さらに作業を行う必要があります。
私はこれを常時行っていますが、それは少し関わっています。私の例では、.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();
}
一般的なリストをデータグリッドにバインドする組み込みの方法はないと思います。ただし、DataGridから継承するUserControlを簡単に作成し、バインディングメソッドをオーバーライド/オーバーロードして汎用リストに対応できます。これに対する基本的なアプローチは、汎用リストからDataTableを生成し、生成されたDataTableを基本DataGridにバインドすることです。もちろん、このアプローチは読み取り専用です。
3.5または2.0を使用している場合はBindingListを使用できます。
私のdatasoで.ToArray()を実行すると、これでMappingNameに問題がありますそれはうまく動作します。 – Dave
素敵な仕事。これは私に痛みをたくさん救った – Andrew