Выпадающий список для фильтрации gridview

#asp.net #vb.net #gridview #filter #drop-down-menu

#asp.net #vb.net #gridview #Фильтр #выпадающее меню

Вопрос:

Я бы хотел, чтобы мой gridview фильтровался по имеющемуся у меня выпадающему списку. Он извлекает определенную информацию из базы данных, поэтому, когда вы выбираете значение из выпадающего списка, он должен выполнить поиск по всем записям и найти только записи со значением ddl в них.

Однако код, который я использую в codebehind для 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 по буквам и выпадающему списку. Проблема заключается в том, что выпадающий список фильтрует 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
  

Комментарии:

1. Вы сначала полностью заполняете сетку, а затем фильтруете, не заполняете, пока не будет выбран фильтр, или сначала вы заполняете фильтр по умолчанию?

2. Gridview уже заполнен, когда я открываю страницу. Затем пользователь сможет щелкнуть по выпадающему списку и выбрать значение для повторного заполнения gridview

3. Я бы изучил фильтрацию вашего объекта данных вместо запроса базы данных. Если это просто для просмотра, а не для редактирования, нет смысла снова обращаться к базе данных, если только она не проверяет наличие новых записей. Linq отлично подходит для запроса объектов данных (коллекций, наборов данных и т. Д.) Для фильтрации по определенному значению. Запрос к базе данных только для фильтрации результатов, которые у вас уже есть, будет намного медленнее, чем заполнение из данных, которые вы получили изначально. Вы всегда можете обновить базу данных из объекта данных после.

4. Это имеет смысл. Все продукты уже перечислены в gridview. Я никогда раньше не использовал Linq, но я слышал хорошие вещи.

5. Сделать что-то подобное не очень сложно. Проверьте это.

Ответ №1:

Удалил мой предыдущий ответ.

На самом деле попробуйте следующее :

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

Нет присвоения значению, поскольку оно является частью Add . Заметил это, когда я попытался скомпилировать тест моего предыдущего ответа, который не сработал.

РЕДАКТИРОВАТЬ: я попробовал приведенный выше код, и он сработал (сделал это на C #), но изменил его, чтобы использовать DbType.Int32 для второго параметра.

Комментарии:

1. Этот код выдал ошибку в Visual Studio, сообщив что-то о разрешении перегрузки.

2. 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.

3. @jlg смотрите мое изменение, оно должно решить проблему.

4. @Kelsey Будь милым. Он ищет помощи. Если вы не можете или не хотите, вы можете вежливо сказать об этом.

5. @jlg Извините за это. Я забыл, что девушки теперь могут быть программистами, водить машины, голосовать и прочее. Любите эту страну: мы все равны в своем праве быть ботаником. =) Если вы получаете новую ошибку и ваша первоначальная проблема решена, вы должны принять правильный ответ здесь (если вы его нашли) и опубликовать новый вопрос. Этот становится довольно загроможденным. Кроме того, убедитесь, что вы можете самостоятельно определить ошибку — это лучший способ обучения. Тем не менее, мы всегда рады помочь.

Ответ №2:

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

Мне кажется, что метод .Add() возвращает значение int , для которого .Value не является свойством.

Подтвердил это, чтобы убедиться: введите описание изображения здесь

Это из MSDN: должно помочь.

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

Комментарии:

1. Да, это то, что Visual Studio говорит мне. Я просто не уверен, что здесь делать. Я никогда не пробовал фильтровать gridview таким образом.

2. Ах, я думал, вы были в замешательстве, почему вы получаете ошибку. =)

3. О 🙂 Я просто надеялся, что кто-то, возможно, сталкивался с этой ошибкой и был готов помочь мне понять, что я делаю неправильно.

Ответ №3:

Я предполагаю, что здесь — я не использую 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)
  

Комментарии:

1. Этот код выдал ошибку в Visual Studio, сообщив что-то о разрешении перегрузки.

2. @jlg, я отредактировал ответ выше, чтобы показать вам варианты перечисления здесь. Эта информация также доступна в MSDN здесь: msdn.microsoft.com/en-us/library/cc491445.aspx