【问题标题】:binding linq query result to gridview将 linq 查询结果绑定到 gridview
【发布时间】:2014-02-17 13:13:03
【问题描述】:

我发现很难将 linq 查询结果绑定到我的 asp.net 页面上的 gridview 控件。在主 Linq 查询中,我从一个表中获取所有用户,该表符合检查“表单已完成”的列的标准 -

using (COLA_AccreditationEntities4 eFactory = new COLA_AccreditationEntities4())
{
    var evaluations = eFactory.Symposium_Evaluation.Where(a => 
            (!a.Completed.HasValue || 
              a.Completed.Value == 0) && a.Active && a.UserID >= 2063).ToList();

然后在代码中,我正在执行一个 foreach 循环以从另一个表中获取与前一个表中的用户 ID 匹配的所有用户 ID -

foreach (var eval in evaluations)
{
    var user = eFactory.SYMPOSIUM_Users.Where(a => a.UserID == eval.UserID.Value 
                         && a.Active.Value && a.UserRole == 1).FirstOrDefault();

    if (user != null && !users.Contains(user.UserID))
    {
        string name = user.FirstName + " " + user.LastName;
        string email = user.Email;
    }
}

我只想在屏幕上显示 user.firstname + user.lastname + user.email。我使用gridview控件来绑定这个,但没有得到想要的结果。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 将 gridview 绑定到查询结果时,我收到“数据源是无效类型。它必须是 IListSource、IEnumerable 或 IDataSource。”错误 - 我在这个论坛中使用 .ToList() 尝试了几个解决方案,但我没有获得 .ToList() 的智能感知。 GridView1.DataSource = user.ToList(); GridView1.DataBind();
  • 你能展示你如何绑定 GridView 吗?请显示完整的 Page_Load 事件处理程序。
  • @MalcolmFrexner Frexner 我把上述方法放在了一个不在 Page_Load 方法中的点击事件中。
  • 以下查询的返回类型是什么:eFactory.SYMPOSIUM_Users.Where(a => a.UserID == eval.UserID.Value && a.Active.Value && a.UserRole == 1 ) 如果我是对的,它应该是您的类型的 IEnumerable。如果这是真的,您应该能够通过将其分配给网格的 DataSource 来绑定它。

标签: c# asp.net linq


【解决方案1】:

您应该能够直接从您的查询绑定到您的网格:

`var users = eFactory.SYMPOSIUM_Users.Where(a => a.UserID == eval.UserID.Value && a.Active.Value && a.UserRole == 1); this.mygrid.DataSource = 用户;

我建议查看asp.net 网站以获取教程。那里有很多好的内容。

更新:
也许您最好的解决方案是从两个表的连接中创建一个匿名类型,这样您就不会重复查询您的数据存储,并且您的数据绑定会更简单。

var result = (from i in eFactory.Symposium_Evaluation
              join user in eFactory.SYMPOSIUM_Users on i.UserID equals user.UserID
              where user.UserRole == 1 &&
                   ((!i.Completed.HasValue || 
                     i.Completed.Value == 0) && 
                    i.Active && a.UserID >= 2063)
              select new {
                  User = user,
                  Symposium = i
              }).ToList();

myDataGrid.DataSource = result;
myDataGrid.DataBind();

现在您可以在网格行模板中:

<%#Eval("User.FirstName")%>
<%#Eval("User.LastName")%>
<%#Eval("User.Email")%>

【讨论】:

  • 谢谢,但我已经尝试过你建议的方法(在我的评论部分),我收到了上面列出的错误。
【解决方案2】:

定义用户类型列表

List<User> users= new List<User>();

修改你的第二个代码块,如下所示

foreach (var eval in evaluations)
{
    var user = eFactory.SYMPOSIUM_Users.Where(a => a.UserID == eval.UserID.Value 
                         && a.Active.Value && a.UserRole == 1).FirstOrDefault();

    if (user != null && !users.Contains(user.UserID))
    {
        users.Add(user);  
    }
}

将gridview中的绑定代码修改为

<%#Eval("FirstName")%>
<%#Eval("LastName")%>

最后将您的网格与用户列表绑定

this.mygrid.DataSource = users;
this.mygrid.DataBind();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多