7

これが私のコードです。正しい行数のバインドされたグリッドが生成されますが、セルは空です。

XAML

<DataGrid
  Name="grid" 
  ItemsSource="{Binding}"
  AutoGenerateColumns="True" />

背後にあるコード

grid.DataContext = cn.Query("select * from SomeTable");
4

5 に答える 5

5

だから私は答えはそうだと思います:それは不可能です。これがハッキーな回避策です。

        ...
        var items = cn.Query("select * from SomeTable");
        grid.DataContext = ConvertToDataTable(items);
    }

    public DataTable ConvertToDataTable(IEnumerable<dynamic> items) {
        var t = new DataTable();
        var first = (IDictionary<string, object>)items.First();
        foreach (var k in first.Keys)
        {
            var c = t.Columns.Add(k);
            var val = first[k];
            if (val != null) c.DataType = val.GetType();
        }

        foreach (var item in items)
        {
            var r = t.NewRow();
            var i = (IDictionary<string, object>)item;
            foreach (var k in i.Keys)
            {
                var val = i[k];
                if (val == null) val = DBNull.Value;
                r[k] = val;
            }
            t.Rows.Add(r);
        }
        return t;
    }
于 2012-11-09T00:37:05.697 に答える
5

docsから、あなたの構文は -- cn.Query("sql")-- 動的に型指定されたオブジェクト ( IEnumerable<dynamic>) のリストを返します。これは、具体的なメンバーを探して列を生成する DataGrid 自動列では機能しません。プロパティをマップするSomeTableの単純なエンティティ クラスを作成してから、 を使用することをお勧めしcn.Query<SomeTableEntity>("select * from SomeTable");ます。

于 2012-11-08T23:05:30.930 に答える
3

非ジェネリック バージョンの Query を使用すると、データの動的表現が返されます。動的 API は、ほとんどの UI データ バインディングには適していません。ジェネリックQuery<T>API を使用して、プロパティが定義された型にデータをロードすることをお勧めします。

完全な pushでは、データに ITypedList を実装し、それに応じてプロパティを公開することも理論的には可能です。しかし、それはそれほど多くの利益を得るためには非常に多くの作業です。

于 2012-11-08T23:07:48.747 に答える
0

純粋なLinqでは不可能です! OLD データセットを再利用し、System.Data.DataSetExtensions を使用して linq に戻すことができます。(エレガントではありませんが、機能します)

// Steal concrete connection from Linq
ModelDEmoWPFContainer l_ctx = new ModelDEmoWPFContainer();
var l_connection = (System.Data.EntityClient.EntityConnection)l_ctx.Connection)
                                   .StoreConnection;

System.Data.SqlClient.SqlCommand l_cmd = 
                  new System.Data.SqlClient.SqlCommand(query_arg);
l_cmd.Connection = (System.Data.SqlClient.SqlConnection) l_connection;
System.Data.SqlClient.SqlDataAdapter l_da = 
                 new    System.Data.SqlClient.SqlDataAdapter(l_cmd);
System.Data.DataSet l_ds = new System.Data.DataSet();     
l_da.Fill(l_ds);

クローンメタデータ

System.Data.DataTable l_dt = l_ds.Tables[0].Clone();    

System.Data.DataSetExtensions 経由で linq に戻る

var dt = (from data in l_ds.Tables[0].AsEnumerable()
                  select data).ToList();

   foreach (DataColumn column in l_dt.Columns)
   {
      var binding = new Binding(string.Format("[{0}]", column.Ordinal));
      datagrid.Columns.Add(new DataGridTextColumn() 
                     { Header = column.ColumnName, Binding = binding });
   }

        datagrid.ItemsSource = dt;
于 2013-02-07T18:04:59.487 に答える