【问题标题】:Unable to set datasource of datagridview from List无法从列表中设置 datagridview 的数据源
【发布时间】:2013-09-16 19:35:45
【问题描述】:

我有一个 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() => 显示名称为“RowError”、“RowState”、“Table”和“hasErrors”的列,它们不是我的列

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

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

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

GVMultiple.DataSource = UserList

谁能告诉我这是怎么回事?

【问题讨论】:

  • IDUserName 是属性还是字段?
  • 定义如下: class UserInfo { public int ID;公共字符串用户名;等等。}

标签: c# linq datagridview datasource


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这解决了其中一个问题。我无法使用 LINQ 过滤我的 dt 并将数据源设置为此的另一部分呢?
  • 不要使用 linq。只需将DataTable 设置为数据源并使用Filter
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    当使用 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()

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2010-11-23
      • 2014-01-14
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多