无法从List设置datagridview的数据源

时间:2013-09-12 12:07:51

标签: c# linq datagridview datasource

我有一个datagridview,它通过OleDbDataReader从Access获取数据。

问题如下 将数据读入数据表,然后设置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() =&gt;显示名称为“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 =&gt;空GridView

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

GVMultiple.DataSource = UserList

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

3 个答案:

答案 0 :(得分:1)

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

按如下所示修改您的课程以使其正常工作。

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

答案 1 :(得分:1)

  

GVMultiple.DataSource =(来自myRow in dt.AsEnumerable()                            myRow.Field(“State”)==“Succeeded”                            选择myRow)

     

制作Linq.ToList()=&gt;显示名称为“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();

答案 2 :(得分: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()中查找名称与搜索字词名称相同的员工。