#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: Я думаю, это нормально для краткости. Но вы сказали, что «настоятельно рекомендуете» делать это именно таким образом. В любом случае, не пытаюсь быть придурком, я знаю, что где-то здесь есть строка, и ее может быть трудно идентифицировать. Я надеюсь, что вы останетесь здесь и продолжите помогать людям решать их проблемы. 🙂