无法从列表中设置数据网格视图的数据源

本文关键字:网格 视图 数据源 置数据 列表 | 更新日期: 2023-09-27 18:31:00

我有一个数据网格视图,它通过OleDbDataReader从 Access 获取数据。

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

dt.Load(dr);

获取 dt 并对其应用 Linq =>空的网格视图

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()

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

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

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

无法从列表中设置数据网格视图的数据源

为了使

DataBinding工作,您必须使用PropertiesFields不支持DataBinding

按如下方式修改您的类以使其正常工作。

class UserInfo 
{ 
    public int ID {get;set;}  //convert fields to property
    public string UserName{get;set;}
} 

GVMultiple.DataSource = (来自 dt 中的 myRow。AsEnumerable() 其中 myRow.Field("State") == "Successed" 选择我的行)

使 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();

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

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

数据视图构造一个索引,这显著增加了 可以使用索引的操作的性能,例如筛选 和排序。数据视图的索引是在数据视图时生成的 创建,并且当任何排序或筛选信息是 改 性。创建数据视图,然后设置排序或 稍后筛选信息至少会导致生成索引 两次:一次是在创建数据视图时,另一次是在创建任何 修改排序或筛选属性。

例如:

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()的过滤结果。