Как фильтровать asp: DataGrid

#asp.net #datagrid #filter

#asp.net #сетка данных #Фильтр

Вопрос:

Как я могу отфильтровать результаты, показанные в asp.net Сетка данных?

HTML

     <asp:TextBox ID="SearchText" runat="server" OnTextChanged="UpdateFilter" />
    <asp:DataGrid ID="gvProjList" runat="server" CellPadding="4" 
        ForeColor="#333333" GridLines="None" style="text-align: left" 
        Width="400px" AllowSorting="true">
        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    </asp:DataGrid>
  

c#

     protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            DataTable dt ....
            ....
            gvProjList.DataSource = dt;
            gvProjList.DataBind();
         }
     }


    protected void UpdateFilter(object sender, EventArgs e)
    {
        // ????
        // ViewState["LastFilter"] = SearchText.Text;
        // gvProjList.DataBind();

    }
  

Ответ №1:

Это простой способ, но что-то вроде этого должно сработать

 protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}

protected void UpdateFilter(object sender, EventArgs e)
{
    BindGrid();
}

private void BindGrid()
{
    DataTable dt = new DataTable();
    //...
    dt.DefaultView.RowFilter = "SomeColumnInTheDataTable = '"   SearchText.Text   "'";
    gvProjList.DataSource = dt.DefaultView;
    gvProjList.DataBind();
}
  

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

1. Конечно, вы собираетесь загружать все данные в — потенциально очень плохие.

2. Действительно, не идеально, но в зависимости от ситуации это быстрый и простой способ

3. Да, согласен. Вы точно ответили на буквальный вопрос — просто хотите убедиться, что кто-то где-нибудь не исчерпает сервер. 😉

Ответ №2:

Ну, все дело в DataTable.

Фильтрация в целом

Вы можете либо справиться с этим, изменив процедуру SQL / store / etc, Которую вы используете для загрузки данных в DataTable, либо (и будьте осторожны здесь), загрузив все данные, а затем используя ADO.Встроенные возможности фильтрации Net.

В последнем случае DataTable.Выбор приходит на ум (Статья о DataTable.Выберите и выполните фильтрацию в ADO.Net ).

Поиск в Particlar

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

Гораздо лучше загружать только то, что вам нужно. Это может привести к некоторым раздражающим хранимым процедурам. Это одна из проблем, в которой инструменты ORM действительно хороши, потому что они позволяют так легко выполнять очень динамичные запросы, не обязательно возясь с большими sprocs с необязательными параметрами и так далее.

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

Ответ №3:

Есть ли причина, по которой вы выполняете свой SQL-запрос в Page_Load(...) ? Если нет, я бы настоятельно рекомендовал использовать SqlDataSource элемент управления, сконфигурированный с помощью инструкции SQL, включающей параметр для вашего фильтра и ControlParameter объект в SqlDataSource.SelectParameters коллекции. Все это может быть сделано декларативно и намного эффективнее как для SQL, так и ASP.NET серверы.

Самое приятное, что все это можно сделать в markup:

 <asp:TextBox ID="SearchText" runat="server" OnTextChanged="UpdateFilter" />
<asp:DataGrid ID="gvProjList" runat="server" CellPadding="4" ForeColor="#333333"
    GridLines="None" Style="text-align: left" Width="400px" AllowSorting="true" DataSourceID="SqlDataSource1">
    <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
</asp:DataGrid>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="SELECT * FROM [Products] WHERE [Description] LIKE '%'   @SearchText   '%';">
    <SelectParameters>
        <asp:ControlParameter DbType="String" ControlID="SearchText" PropertyName="Text"
            DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>
  

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

1. Урок, извлеченный из-1: не отвечайте на вопрос, который не был задан, верно?

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

3. Чтобы дать вам небольшой контекст, в моем магазине встроенный / объединенный SQL вообще не разрешен, и весь доступ к данным должен осуществляться на уровне доступа к данным (отдельный проект). Так вот откуда у меня такая нервная реакция.

4. @Brian — Я понимаю проблемы архитектуры, о которых вы говорите, но для краткости я просто включил встроенный SQL. Я не думаю, что имеет смысл вдаваться в концепции DAL в каждом сообщении, которое включает доступ к данным. Если вы хотите сказать, что никто никогда не должен публиковать пример с SqlDataSource с помощью встроенной инструкции SQL для примера, я не согласен с этим утверждением. Сказав все это, спасибо за отзыв. Я все еще новичок здесь и надеюсь научиться в процессе публикации ответов и решения проблем.

5. @pseduocoder: Я думаю, это нормально для краткости. Но вы сказали, что «настоятельно рекомендуете» делать это именно таким образом. В любом случае, не пытаюсь быть придурком, я знаю, что где-то здесь есть строка, и ее может быть трудно идентифицировать. Я надеюсь, что вы останетесь здесь и продолжите помогать людям решать их проблемы. 🙂