Если вдруг вам потребовалось сделать фильтрацию данных в стандартном ASP.NET контроле GridView, то не спешите расстраиваться и смотреть в сторону всякий телериков. Все можно сделать своими руками. Получится примерно так:
Итак, вот что нужно сделать для того, чтобы получить такой результат. Во первых, создать GridView и объявить колонку, по которой будете фильтровать как TemplateField.
<asp:gridview autogeneratecolumns="False" cellpadding="4" forecolor="#333333" gridlines="None" id="ListGrid" runat="server">
<columns>
<asp:boundfield datafield="Name" headertext="Название">
<asp:templatefield headertext="Тип Записи">
<headertemplate>
Тип Записи:
<asp:dropdownlist autopostback="True" id="typeSelect" onselectedindexchanged="typeSelect_SelectedIndexChanged" runat="server">
<asp:listitem text="Все" value="All"></asp:listitem>
<asp:listitem text="Автомобили" value="1"></asp:listitem>
<asp:listitem text="Самолеты" value="2"></asp:listitem>
<asp:listitem text="Мотоциклы" value="3"></asp:listitem>
</asp:dropdownlist>
</headertemplate>
<itemtemplate>
<#Eval("Type")>
</itemtemplate>
<itemstyle horizontalalign="Center">
</itemstyle></asp:templatefield>
</asp:boundfield>
</columns>
</asp:gridview>
Для простоты будем связывать нашу таблицу со списком вот таких вот элементов:
public class Machine
{
public string Name { get; set; }
public string Type { get; set; }
public Machine(string _name, string _type)
{
Name = _name;
Type = _type;
}
}
Давайте все сделаем очень просто и очень понятно. Создаем список элементов типа Machine прямо в Page_Load и там же связываем его с таблицей. protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
List<machine> list = new List<machine>();
list.Add(new Machine("ВАЗ", "1"));
list.Add(new Machine("BMW", "1"));
list.Add(new Machine("Airbus", "2"));
list.Add(new Machine("Harley-Davidson", "3"));
ListGrid.DataSource = list;
ListGrid.DataBind();
}
}
Ну и неплохо бы запомнить выбор фильтра. Для этого нам нужно определить свойство, которое будет хранить текущее состояние фильтра и написать обработчик события RowDataBound грида, который будет устанавливать состояние фильтра:
public string SelectedType
{
get
{
if (ViewState["SelectedType"] == null)
return string.Empty;
else
return ViewState["SelectedType"].ToString();
}
set
{
ViewState["SelectedType"] = value;
}
}
protected void ListGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
DropDownList cmbSelect = (DropDownList)e.Row.FindControl("typeSelect");
cmbSelect.SelectedValue = SelectedType == "" ? "All" : SelectedType;
}
}
А теперь магия, благодаря которой наш фильтр будет работать и фильтровать элементы - обработчик события Onselectedindexchanged дропдауна с фильтром. Ту часть, которая заполняет список я опущу, самое важное в конце:
DropDownList ddlType = (DropDownList)sender;
string selValue = ddlType.SelectedValue;
//Если не установлено "Показывать все", то фильтруем
if (selValue != "All")
ListGrid.DataSource = list.Where(x => x.Type == selValue);
//Если установлено, то показываем все.
else
ListGrid.DataSource = list;
SelectedType = selValue;
ListGrid.DataBind();
Вот и все.

<#Eval("Type")> <--- пропустили %
ОтветитьУдалитьПример кода typeSelect_SelectedIndexChanged лучше выложить полностью, начиная от заголовка метода, заканчивая "}"
и сделайте нормальным оформление кода в примерах на asp
ОтветитьУдалить