【问题标题】:Can't bind a GridView to a LINQ to SQL Result无法将 GridView 绑定到 LINQ to SQL 结果
【发布时间】:2009-05-23 16:36:36
【问题描述】:

好的,我确实是 LINQ 的新手,并且在上周阅读了我所能阅读的所有内容。我只是在玩,试图遵循我找到的一些示例(实际上是 Scott Gu 关于该主题的 PDF),我完全不知所措。有人可以告诉我为什么,当我使用下面的代码将 GridView 绑定到下面的查询时,我没有得到任何数据?我可以在调试时看到结果,所以我知道它们是从数据库中返回的,它们只是显然没有正确绑定。我读到一些内容说您无法直接绑定到结果,并且您必须使用 BindingSource 作为中间步骤?

有人,请告诉我我在这里缺少什么。

protected void Page_Load(object sender, EventArgs e)
{
    SwapDBDataContext db = new SwapDBDataContext();

    var users = from u in db.aspnet_Users
                select new
                {
                   Name =  u.UserName,
                   ID = u.UserId
                };

    GridView1.DataSource = users;
    GridView1.DataBind();

}

我只是在使用一个空的 GridView。我曾假设绑定会负责设置列以匹配查询的结果列 - 这是一个愚蠢的初学者错误吗?

    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    您不必转换为列表或数组。绑定至少需要一个 IEnumerable,这就是您的 Users 变量。匿名类型只是编译器生成的具体类型的预编译占位符,因此您还应该能够绑定到匿名类型。

    您的 GridView 可能没有设置 AutoGeneratedColumns 属性,这是让数据源定义显示哪些列所必需的。尝试启用它,看看您的 GridView 是否显示您的查询结果。

    【讨论】:

    • 事实证明这是 AutoGenerateColumns。我正在使用一些来自 HeroCoder.com 的代码,我们不时在较小的项目中使用这些代码,以避免必须连接所有成员资格的东西——它为 asp.net 成员资格提供了一个简单而可靠的管理工具。无论如何,事实证明他们正在他们的代码中禁用 AutoGenerateColumns。将它添加回我的 gridview 明确地按照建议完成了这个技巧。谢谢!
    • 很高兴为您服务。我自己也遇到过很多次这个问题,我想有人应该提到它。 :D
    【解决方案2】:

    无法理解为什么这不起作用。我使用(几乎)您的代码拼凑了一个页面。它非常适合我。

    protected void Page_Load(object sender, EventArgs e)
    {
        BlodsockerkollenDataContext db = new BlodsockerkollenDataContext();
        var members = from m in db.Members
                      select new { Id = m.Id, Email = m.Email };
    
        GridView1.DataSource = members;
        GridView1.DataBind();
    }
    

    我不同意您应该使用 ToList() 的建议答案。 GridView 能够获取和遍历一个 IEnumerable,而 IQueryable 继承了 IEnumerable。

    不,应该不需要声明 BindingSource。

    也许你已经在你的 GridView 中声明了一些东西?我的只是空的,直接从工具箱中拉出来的:

    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
    

    【讨论】:

    • 感谢您抽出宝贵时间来做这件事。简而言之,你是对的。它应该工作。我不知道发生了什么。我已将 LINQ to SQL Classes 项添加到现有项目并从那里开始工作 - 该项目中必须有一些东西阻止此代码正常运行。不知道是什么,但我也从头开始创建了一个新项目并使用了完全相同的代码 - 它运行良好!现在我有一些工作要做!
    【解决方案3】:
    protected void Page_Load(object sender, EventArgs e)   
    {   
       SwapDBDataContext db = new SwapDBDataContext();   
    
       GridView1.DataSource = from u in db.aspnet_Users   
                select new   
                {   
                   Name =  u.UserName,   
                   ID = u.UserId   
                };   
    
      GridView1.DataBind();   
    }   
    

    【讨论】:

      【解决方案4】:

      尝试做

      GridView1.DataSource = users.ToList();
      

      GridView1.DataSource = users.ToArray();
      

      可能是因为延迟执行,查询根本没有执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-27
        • 2012-04-20
        • 2014-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多