【问题标题】:Binding DataSet to GridView将数据集绑定到 GridView
【发布时间】:2009-10-22 14:21:51
【问题描述】:

我遇到了问题,我觉得这很简单,但我做得不对。

我正在执行一个简单的 ASP.NET 项目。我有一个从 Oracle 数据库填充的数据集。 DataSet 中的表有两列:“account_code”和“account_descr”。

用户在文本框中输入搜索词。我使用 LINQ 查询从 DataSet 中获取结果并将它们放入另一个变量中。

然后我尝试将变量绑定到gridview。

代码:

Dim results = AccountsDataSet.Tables("Results")

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code")

GridView1.DataSource = filteredResults
GridView1.DataBind()

上面的代码有效。唯一的事情是它只显示一列。我需要它来显示两列。但是,如果我将 LINQ 行更改为:

Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select q.Item("account_code"), q.Item("account_descr")

它会抛出错误“范围变量名称只能从不带参数的简单名称或限定名称中推断出来。”

有什么想法吗?

【问题讨论】:

    标签: asp.net linq gridview dataset


    【解决方案1】:

    您需要返回匿名类型来获取您需要的所有属性,否则它将返回所有公共属性,其中还包括 RowError 和 HasErrors。这是我使用的代码:

     gvCustomers.DataSource = from c in ds.Tables[0].AsEnumerable()
                                             where c["FirstName"].ToString().StartsWith("J")
                                             select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
                    gvCustomers.DataBind(); 
    

    由于 DataTable 不是 IEnumerable,因此我使用了 AsEnumerable() 方法,该方法将返回 DataRow 的强类型集合。您还可以显式指定类型,如以下代码所示:

      gvCustomers.DataSource = from DataRow c in ds.Tables[0].Rows
                                                 where c["FirstName"].ToString().StartsWith("J")
                                                 select new { FirstName = c["FirstName"].ToString(), LastName = c["LastName"].ToString() }; 
                        gvCustomers.DataBind(); 
    

    希望对您有所帮助!

    【讨论】:

    • 谢谢!这很好用。我想我尝试了类似您的第二个示例的方法,但我始终无法使其正常工作。
    【解决方案2】:

    您的选择语句明确要求一列。以下信息与您相关,希望有意义

    有一条需要注意的规则是 LINQ 规则,而不是 LINQ to Entities。当您在投影中创建动态属性并使用函数执行此操作时,LINQ 无法确定调用该属性的内容,因此您必须像我在这里所做的那样使用变量名称“fullname”来命名它。

    Dim custs = From cust In .Customer  By cust.FullNameAlpha 
    SELECT cust.ContactID, fullname = cust.LastName.Trim & "," & cust.FirstName
    

    【讨论】:

      【解决方案3】:

      如果我错了,请纠正我,但 LINQ 行不应该是这样的:

      Dim filteredResults = From q In results Where q.Item("account_code").ToString.StartsWith(search) Select New With { .AccountCode = q.Item("account_code"), .AccountDesc = q.Item("account_descr") }
      

      不要选择单个属性,而是选择整个实体。

      【讨论】:

      • 我的理解是你也可以。当我选择整个东西并将其绑定到gridview时,它只显示“RowError”和“HasErrors”列。就好像它只显示了filteredResults的属性,而不是实际的结果。
      • 我对样本做了一些改动,使用了匿名类型。我不是 VB 专家,但这可能是您需要的。欲了解更多信息,请参阅:hookedonlinq.com/SelectOperator.ashx
      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2013-03-27
      • 1970-01-01
      • 2014-02-09
      • 2011-09-15
      相关资源
      最近更新 更多