【问题标题】:Dropdown list to filter gridview过滤gridview的下拉列表
【发布时间】:2011-10-21 16:09:11
【问题描述】:

我希望我的 gridview 被我拥有的下拉列表过滤。它从数据库中提取特定信息,因此当您从下拉列表中选择一个值时,它应该搜索所有记录并仅找到其中包含 ddl 值的记录。

我在 SelectedIndexChanged 的​​代码隐藏中使用的代码不正确。我收到一条错误消息说'Value' is not a member of 'Integer'. 这是在线dsCompanyFilter.SelectParameters.Add

这可能与 gridview 未正确绑定到下拉列表有关,但我不确定如何修复该代码。请帮忙!

  <asp:Content ID="Content2" ContentPlaceHolderID="body" Runat="Server"><br /><br /><br />
<asp:linkbutton id="btnAll" runat="server" text="ALL" onclick="btnAll_Click" />
<asp:repeater id="rptLetters" runat="server" datasourceid="dsLetters">
<headertemplate>
 |
</headertemplate>
<itemtemplate>
 <asp:linkbutton id="btnLetter" runat="server" onclick="btnLetter_Click" 
 text='<%#Eval("Letter")%>' />
 </itemtemplate>

<separatortemplate>
 |
</separatortemplate>
</asp:repeater>

<asp:sqldatasource id="dsLetters" runat="server" connectionstring="<%$ 
 ConnectionStrings:ProductsConnectionString %>"
 selectcommand="SELECT DISTINCT LEFT(ProductName, 1) AS [Letter] FROM [Product]">
</asp:sqldatasource>

Filter By Company:<asp:DropDownList ID="ddlCompany" runat="server" 
DataSourceID="dsCompanyFilter"  DataTextField="CompanyName" DataValueField="CompanyID">
</asp:DropDownList>
<asp:gridview id="gvProducts" runat="server" AutoGenerateColumns="False" 
datakeynames="ProductID" datasourceid="dsProductLookup" 
style="margin-top: 12px;">
<Columns>
     <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
     SortExpression="ProductName" />
</Columns>

</asp:gridview>

<asp:sqldatasource id="dsProductLookup" runat="server" connectionstring="<%$  
ConnectionStrings:ProductsConnectionString %>"
Selectcommand="SELECT ProductID, ProductName FROM [Product] ORDER BY [ProductName]">
 </asp:sqldatasource>

<asp:SqlDataSource ID="dsCompanyFilter" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ProductsConnectionString %>" 
    SelectCommand="SELECT [CompanyName], [CompanyID] FROM [Company]">
</asp:SqlDataSource>

</asp:Content>

此代码通过 Letter 和 Dropdown 过滤 gridview 中的结果。问题在于过滤gridview的下拉列表。

 Protected Sub btnLetter_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim btnLetter As LinkButton = TryCast(sender, LinkButton)
    If btnLetter Is Nothing Then
        Return
    End If
    dsProductLookup.SelectCommand = [String].Format("SELECT ProductID, ProductName 
                                                   FROM [Product] 
                                                   WHERE ([ProductName] LIKE '{0}%') 
                                                   ORDER BY [ProductName]", btnLetter.Text)
 End Sub

这是有问题的部分。我现在得到错误,必须声明标量变量@CompanyID

Protected Sub ddlCompany_SelectedIndexChanged(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles ddlCompany.SelectedIndexChanged
    dsProductLookup.SelectCommand = "SELECT ProductName, CompanyID, CompanyName 
                                     FROM Product, Company 
                                     WHERE CompanyID = @CompanyID 
                                     ORDER BY ProductName"
    dsProductLookup.SelectParameters.Add("@CompanyID", DbType.Int32, 
    ddlCompany.SelectedValue)
End Sub

【问题讨论】:

  • 您是先完全填充网格然后过滤,而不是在选择过滤器之前填充,还是先填充默认过滤器?
  • 当我拉起页面时,gridview 已经被填充了。然后用户将能够单击下拉列表并选择一个值来重新填充网格视图
  • 我会考虑过滤您的数据对象,而不是重新查询数据库。如果只是查看而不是编辑,则没有必要再次与数据库交谈,除非它是为了检查新记录。 Linq 非常适合查询数据对象(集合、数据集等)以按特定值进行过滤。查询数据库只是为了过滤您已经拥有的结果将比从您最初获取的数据中填充要慢得多。之后您可以随时从数据对象更新数据库。
  • 这是有道理的。所有产品都已在 gridview 中列出。我以前从未使用过 Linq,但我听到了好消息。
  • 做这样的事情并不难。看看吧。

标签: asp.net vb.net gridview filter drop-down-menu


【解决方案1】:

删除了我之前的回答。

实际上尝试以下方法:

dsProductLookup.SelectParameters.Add("@ProductID",
    DbType.Int32, ddlCompany.SelectedValue)

没有赋值,因为它是Add 的一部分。当我尝试编译我以前的答案的测试时注意到了这一点,但它不起作用。

编辑:我尝试了上面的代码并且它工作(在 C# 中完成)但将其更改为使用 DbType.Int32 作为第二个参数。

【讨论】:

  • 这段代码在 Visual Studio 中抛出一个错误,说明重载解决方案。
  • Overload resolution failed because no accessible 'Add' can be called without a narrowing conversion: 'Public Function Add(name As String, dbType As System.Data.DbType, value As String) As Integer': Argument matching parameter 'dbType' narrows from 'System.Data.SqlDbType' to 'System.Data.DbType'. Public Function Add(name As String, type As System.TypeCode, value As String) As Integer: Argument matching parameter 'type' narrows from 'System.Data.SqlDbType' to System.TypeCode.
  • @jlg 看到我的更改应该可以解决问题。
  • @Kelsey 很好。他正在寻求帮助。如果你不能或不想,你可以礼貌地说出来。
  • @jlg 很抱歉。我忘了女孩现在可以成为程序员、开车、投票等等。爱这个国家:我们都有权成为书呆子。 =) 如果您遇到新错误并且您的原始问题已解决,您应该在此处接受正确答案(如果您找到了)并发布新问题。这个越来越乱了。另外,请务必查看您是否可以自己找出错误 - 这是最好的学习方式。不过,我们总是很乐意提供帮助。
【解决方案2】:
dsProductLookup.SelectParameters.Add("@ProductID", SqlDbType.Int).Value

在我看来,.Add() 方法返回一个 int,.Value 不是一个属性。

确认以确保:

这是来自 MSDN:应该有所帮助。

http://msdn.microsoft.com/en-us/library/w1kdt8w2.aspx

【讨论】:

  • 是的,这就是 Visual Studio 告诉我的。我只是不确定在这里做什么。我从未尝试过以这种方式过滤网格视图。
  • 啊,我以为你对为什么会收到错误感到困惑。 =)
  • 哦 :) 我只是希望有人遇到过这个错误并愿意帮助我理解我做错了什么。
【解决方案3】:

我在这里猜——我不使用SqlDataSources——但看起来SelectParameters.Add 需要三个参数。改变这个会发生什么:

dsProductLookup.SelectParameters.Add("@ProductID", SqlDbType.Int).Value = ddlCompany.SelectedValue

到这里:

dsProductLookup.SelectParameters.Add("@ProductID", DbType.Int32, ddlCompany.SelectedValue)

或者这个:

dsProductLookup.SelectParameters.Add("@ProductID", TypeCode.Int32, ddlCompany.SelectedValue)

【讨论】:

  • 这段代码在 Visual Studio 中抛出一个错误,说明重载解决方案。
  • @jlg,我已经编辑了上面的答案,在这里向您展示了枚举选项。此信息也可在 MSDN 上找到:msdn.microsoft.com/en-us/library/cc491445.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多