0

我有一个 datagridview,它通过OleDbDataReader.

问题如下 将数据读入数据表然后设置datasource = dt=> 工作

dt.Load(dr);

获取 dt 并将 Linq 应用到它 => 空 GridView

GVMultiple.DataSource = (from myRow in dt.AsEnumerable()
                         where myRow.Field<string>("State") == "Succeeded"
                         select myRow)

使Linq.ToList()=> 显示名称为 "RowError","RowState","Table" 和 "hasErrors" 的列不是我的列

GVMultiple.DataSource = (from myRow in dt.AsEnumerable()
                         where myRow.Field<string>("State") == "Succeeded"
                         select myRow).ToList()

将数据读入Object自定义List then设置datasource = List=> 空GridView

while (dr.Read())
{
    UserList.Add(new UserInfo()
    {
        ID = (int)dr["ID"],
        UserName = (string)dr["User Name"]
    });
}

GVMultiple.DataSource = UserList

有人可以告诉我发生了什么吗?

4

3 回答 3

1

为了完成DataBinding工作,您必须使用Properties. Fields不支持DataBinding

如下修改您的类以使其工作。

class UserInfo 
{ 
    public int ID {get;set;}  //convert fields to property
    public string UserName{get;set;}
} 
于 2013-09-12T12:38:49.270 回答
1

GVMultiple.DataSource = (来自 myRow in dt.AsEnumerable() where myRow.Field("State") == "Succeeded" select myRow)

使 Linq.ToList() => 显示名称为“RowError”、“RowState”、“Table”和“hasErrors”的列,它们不是我的列

RowError","RowState","Table" 和 "hasErrors" 是 DataRow 的属性 - 这是您创建的列表中的内容。

查看 .CopyToDataTable() 扩展方法。 http://msdn.microsoft.com/en-us/library/bb396189.aspx

    GVMultiple.DataSource = (from myRow in dt.AsEnumerable()
                     where myRow.Field<string>("State") == "Succeeded"
                     select myRow).CopyToDataTable();
于 2013-09-12T12:51:25.117 回答
0

原因是数据网格视图无法将新数据的集合识别为可接受的显示格式。

当使用 Linq 查询过滤数据并在数据网格视图中重新显示时,您必须始终将查询结果作为数据视图返回到任何数据源。

DataView 构造索引,显着提高了可以使用索引的操作的性能,例如过滤和排序。DataView 的索引是在创建 DataView 和修改任何排序或过滤信息时建立的。创建一个 DataView 然后设置排序或过滤信息会导致索引至少构建两次:一次是在创建 DataView 时,另一次是在修改任何排序或过滤器属性时。

例如:

DataTable dt = empData.loadEmployee();
BindingSource bs = new BindingSource();
bs.DataSource = dt.AsEnumerable()
    .Where(c => c.Field<string>("First Name").ToLower()
    .Contains(txtSearch.Text.ToLower())).AsDataView();

dgvEmpManag.DataSource = bs;

在示例中,我正在寻找名字与文本框中的搜索词类似的员工,txtSearch当找到时,数据网格视图将显示我的搜索过滤结果AsDataView()

于 2016-06-24T17:57:45.647 回答