Откуда у вас несколько элементов управления для gridview?

#asp.net #gridview #webforms

#asp.net #просмотр сетки #веб-формы #gridview

Вопрос:

Например, у меня есть gridview и два текстовых поля.

Одно текстовое поле предназначено для текста для поиска. Второе текстовое поле — это порядковый номер для поиска.

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

Спасибо за любую помощь.

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

1. Можете ли вы поделиться SQL-запросом, который вы используете для доступа к своим данным?

2. Это просто визуальный запрос с данными.

3. у вас есть кнопка отправки, или вы хотите отфильтровать потерянный фокус

Ответ №1:

Хорошо, надеюсь, вы еще не решили эту проблему, потому что я потратил несколько минут, чтобы придумать пример, который, я думаю, будет делать в значительной степени то, что вы хотите.

Для доступа к БД используется хранимая процедура, но вы можете использовать ObjectDataSource с DAL или просто встроить инструкцию SQL в SqlDataSource и т.д.

Разметка:

 Product ID:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" ControlToValidate="TextBox1" runat="server" ErrorMessage="You must enter a number"
    ValidationGroup="vg1" Type="Integer" Operator="DataTypeCheck"></asp:CompareValidator>
<br />
Description:
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
<asp:Button ID="cmdSearch" runat="server" Text="Search" ValidationGroup="vg1" /><br />
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="spGetProducts"
    CancelSelectOnNullParameter="False" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:ControlParameter ControlID="TextBox1" PropertyName="Text" DbType="String" DefaultValue="" />
        <asp:ControlParameter ControlID="TextBox2" PropertyName="Text" DbType="Int32" DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>
  

И T-SQL для вашего запроса:

 CREATE PROCEDURE spGetProducts
    @ProductId int = NULL
    ,@ProductDescription nvarchar(100) = NULL
AS
BEGIN
    SELECT [ProductId]
        ,[ProductDescription]
    FROM [Products]
    WHERE (
        (
            (@ProductId IS NULL)
            OR
            ([ProductId] LIKE %   @ProductId   %)
        )
        AND
        (
            (@ProductDescription IS NULL)
            OR
            ([ProductDescription] LIKE %   @ProductDescription   %;)
        )
    );
END
  

Если пользователь ничего не вводит ни в одно из полей, SqlDataSource все равно будет привязан из-за SqlDataSource.CancelSelectOnNullParameter = False но пустой параметр не будет отправлен с запросом из-за ControlParameter.DefaultValue того, что он установлен. Затем хранимая процедура вставит нулевое значение в параметр и, по сути, пропустит эту часть фильтрации в предложении WHERE.

Надеюсь, это поможет.

Ответ №2:

Вы можете проверить текстовые поля с помощью (TextBox1.Text.Trim.Length > 0) или (TextBox1.Text = «»)

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

1. И затем, в зависимости от значения, введенного в текстовые поля, вы можете использовать ifelse для использования логики фильтрации

2. Более приемлемая форма для проверки, пусто ли текстовое поле, это String.IsNullOrEmpty(TextBox1.Text)

Ответ №3:

Похоже, что вы действительно спрашиваете, как вы фильтруете свой источник данных на основе более чем одного возможного параметра фильтра. Для объяснения этого потребуется знать, каков ваш источник данных. В любом случае, gridview будет отображать только отфильтрованные результаты, верно?

Если вы используете SQL для своего источника данных, техника будет полностью отличаться от фильтрации коллекции в памяти. Так что дополнительная информация об этом была бы полезна.