2011-06-24 12 views
1

LINQクエリからデータグリッドビューがいくつかあるフォームで作業していますが、問題はありませんが、並べ替えは機能しません。 LINQの結果が並べ替えをサポートしていないため、読み込みを行った後。LINQ結果をデータセット/テーブルにコピー

私はLINQの結果を既に持っているので、結果をデータセットまたはデータテーブルにコピーして、データグリッドビューをバインドして並べ替えを実行する方法がありますか?

おかげ

EDIT:カントは試してみると、正しいものをupvoteので、答えをみんなに おかげで、悲しいことに、私は2週間の休業日にオフです。私はそれがC#では私のリスト

答えて

2

最後に、各オプションのビットを使用して、それをヌル入力可能なフィールドで動作させるため少し微調整しました。

まず最初は、私はそれそのコードにMODを検索し、見つかった私はこれを試したときに列がNULL可能だった場合、それは失敗するこれがここで行われ

http://msdn.microsoft.com/en-us/library/bb669096.aspx

、VBにCopyToDataTable機能を取得していますうまくいくでしょう。ここでは、フル

Public Function ExtendTable(ByVal table As DataTable, ByVal type As Type) As DataTable 
    For Each f As FieldInfo In type.GetFields() 
     If (Not _ordinalMap.ContainsKey(f.Name)) Then 
     Dim dc As DataColumn 
     dc = If(table.Columns.Contains(f.Name), table.Columns(f.Name), table.Columns.Add(f.Name, f.FieldType)) 
     _ordinalMap.Add(f.Name, dc.Ordinal) 
     End If 
    Next f 
    For Each p As PropertyInfo In type.GetProperties() 
     If Not _ordinalMap.ContainsKey(p.Name) Then 
     Dim colType As Type = p.PropertyType 
     If (colType.IsGenericType) AndAlso (colType.GetGenericTypeDefinition() Is GetType(Nullable(Of))) Then 
      colType = colType.GetGenericArguments()(0) 
     End If 
     Dim dc As DataColumn = IIf(table.Columns.Contains(p.Name), table.Columns(p.Name), table.Columns.Add(p.Name, colType)) 
     _ordinalMap.Add(p.Name, dc.Ordinal) 
     End If 
    Next 
    Return table 
    End Function 

Upvotesそれらはすべて私はちょうどそれが滑らかな印象

+0

1であるとして、このオプションを取り、その答えとしてこれをマーク働いていたとして、すべてのラウンドであります! –

1

の上になります戻るときしかし、私はこのようにそれを行う:

 DataTable dt = new DataTable(); 
     dt.Columns.Add("a", Type.GetType("System.String")); 
     dt.Columns.Add("b", Type.GetType("System.String")); 
     dt.Columns.Add("c", Type.GetType("System.String")); 
     dt.Columns.Add("d", Type.GetType("System.String")); 

     foreach (var row in [linqQueryName]) 
     { 
      DataRow destRow = dt.NewRow(); 
      destRow["a"] = row.linqCol1; 
      destRow["b"] = row.linqCol2; 
      destRow["c"] = row.linqCol3; 
      destRow["d"] = row.linqCol4; 
      dt.Rows.Add(destRow); 
     } 
1

はコードを参照してください:

ここでテストデータがリスト上のLINQクエリからのデータであり、クラスのプロパティ

Dim dataTable As New DataTable() 
     dataTable.Columns.Add("ID", GetType(Integer)) 
     dataTable.Columns.Add("Name", GetType(String)) 
     For Each item As var In testData 
     Dim dataRow As DataRow = dataTable.NewRow() 
     dataRow("ID") = item.ID 
     dataRow("Name") = item.Name 
     dataTable.Rows.Add(dataRow) 
     Next 
2

あなたはこのためにCopyToDataTable拡張メソッドを使用することができるようにIDと名前を持ちます。

DataRowのタイプのIEnumerable<T>が実際に実装されていますが、MSDNでは独自のextension method which works on anonymous typesの例があります。


私は実際には、過去に私がソートして、コンストラクタでのIListとしてクエリでそれのインスタンスの作成をサポートするBindingListを作成することによって、同様の最終結果を作成しました、CopyToDataTableを使用していませんでした、 CopyToDataTableのアプローチは私にとってはよりクリーンに見えます。

関連する問題