将datagrid绑定到datareader

时间:2013-12-11 22:02:54

标签: wpf datagrid ado.net datareader

我希望能够将SQL输入到文本框中并在WPF Datagrid中显示结果。我想从SqlDataReader开始,并将datagrid的ItemsSource设置为数据读取器:

using (var cmd = conn.CreateCommand()) {
    cmd.CommandText = sql.Text;
    sqlResults.ItemsSource = cmd.ExecuteReader();
}

但是这失败并出现以下错误:Invalid attempt to call FieldCount when reader is closed,我理解这意味着当WPF到处读取行对象的FieldCount属性时,using块已退出。

所以我尝试使用LINQ和ToList来获取会在内存中保留的内容:

sqlResults.ItemsSource = cmd.ExecuteReader().Cast<DbDataRecord>().ToList();

但这只显示每一行的'FieldCount',这显然是DbDataRecord唯一拥有的属性。

我考虑过的一些解决方案:

  • 绑定到DataTable而不是DataReader?但我不需要编辑功能。
  • 将每一行选择为内存数据结构?我可以使用什么数据结构?我不能使用匿名类型,因为列的名称和类型会根据SQL语句而更改。如果我使用List<object>,数据网格如何知道为列表中的每个对象生成列?
  • 创建自定义类型描述符?这似乎有点矫枉过正。

但我觉得解决方案应该非常简单容易。我错过了一些基本的东西吗?

2 个答案:

答案 0 :(得分:2)

也许DataTable过度杀伤,但它可以满足你的需要。

答案 1 :(得分:-1)

嗯,是的,根据你所说的,我可能会使用包含与DB列匹配的属性的结构,只需用linq填充它,这样就可以很容易地绑定它。

使用JavaScript工作更多,并想知道你是否能找到Eval的等价物(建议永远不会被创建者使用,顺便说一句:),如果这会有帮助......