用于过滤gridview的下拉列表

时间:2011-10-21 16:09:11

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

我希望我的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>

此代码按字母和下拉列表过滤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

3 个答案:

答案 0 :(得分:0)

删除了我之前的回答。

实际尝试以下方法:

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

没有赋值给它,因为它是Add的一部分。当我尝试编译我之前的答案的测试时,注意到这一点。

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

答案 1 :(得分:0)

我在这里猜测 - 我不使用SqlDataSource s - 但看起来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)

答案 2 :(得分:0)

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

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

确认它以确保: enter image description here

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

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