#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 для своего источника данных, техника будет полностью отличаться от фильтрации коллекции в памяти. Так что дополнительная информация об этом была бы полезна.