در این مقاله با هم به سراغ نحوه ی فیلتر کردن ردیف های GridView بر اساس انتخاب های چندگانه در ASP.NET با سی شارپ و ویژوال بیسیک خواهیم رفت.
جستجو در GridView در داخل رویداد SelectedIndexChanged مربوط به ListBoxقرار دارد.
دیتابیس
در اینجا من از دیتابیس Microsoft Northwind استفاده میکنم.
فیلتر کردن GridView
ListBox ما تعدادی کشور را نشان میدهد و GridView با سوابق جدول مشتری های مربوطه در دیتابیس Northwind پر میشود. زمانی که گزینه های ListBox انتخاب یا عدم انتخاب میشوند ، موارد GridView بر اساس کشور های انتخاب شده فیلتر میشود.
اگر هیچ یک از اشیای ListBox انتخاب نشده باشد ، آنگاه GridView همه ی موارد را نمایش خواهد داد.
HTML
بخش مربوط به HTML شامل یک ASP.NET GridView و کنترل ListBox خواهد بود. کنترل ListBox بر روی رویداد OnSelectedIndexChanged است و خاصیت SelectionMode بر روی Multiple Selections تنظیم میشود.
<asp:ListBoxID="lstCountries"runat="server"AutoPostBack="true"SelectionMode="Multiple"OnSelectedIndexChanged="Country_Selected"> <asp:ListItemText="Argentina"Value="Argentina"></asp:ListItem> <asp:ListItemText="Austria"Value="Austria"></asp:ListItem> <asp:ListItemText="Belgium"Value="Belgium"></asp:ListItem> <asp:ListItemText="Brazil"Value="Brazil"></asp:ListItem> <asp:ListItemText="Canada"Value="Canada"></asp:ListItem> </asp:ListBox> <hr/> <asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="false"CssClass="grid"AllowPaging="true"OnPageIndexChanging="OnPageIndexChanging"> <Columns> <asp:BoundFieldHeaderText="Contact Name"DataField="ContactName"/> <asp:BoundFieldHeaderText="Country"DataField="Country"/> </Columns> </asp:GridView>
فضای نام ها
احیتاج به افزودن فضای نام های زیر دارید :
سی شارپ
using System.Data; using System.Data.SqlClient; using System.Configuration;
ویژوال بیسیک
Imports System.Data Imports System.Data.SqlClient Imports System.Configuration
پر کردن GridView
GridView در داخل رویاد Page Load پر میشود. GridView با SQL Query داینامیک که بر اساس انتخاب های چندگانه ی ListBox ساخته شده است ، پر میشود.
اشیای ListBox ارث بری میشوند و اگر یک شئ انتخاب شود ، آنگاه به SQL Query نیز اضافه میشود.
در نهایت SQL Query با اضافه شدن شرط WHERE تکمیل میشود و GridView پر میشود.
منطق آن بر اساس زیر است :
"SELECT ContactName, Country FROM Customers"
اگر اشیا انتخاب شوند (در اینجا آرژانتین و اتریش) SQL به صورت زیر در میاید:
"SELECT ContactName, Country FROM Customers WHERE Country IN ('Argentina', 'Austria')"
از آنجاییکه SQL Query به صورت داینامیک است ، GridView میتواند به راحتی توسط انتخاب های چندگانه ListBox فیلتر شود. GridView بر روی رویداد OnPageIndexChanging قرار دارد که به راحتی PageIndex جدید را به GridView قرار میدهد و آن را rebind میکند.
سی شارپ
protectedvoid Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { this.BindGrid(); } } privatevoid BindGrid() { string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; string query = "SELECT ContactName, Country FROM Customers"; string condition = string.Empty; foreach (ListItem item in lstCountries.Items) { condition += item.Selected ? string.Format("'{0}',", item.Value) : ""; } if (!string.IsNullOrEmpty(condition)) { condition = string.Format(" WHERE Country IN ({0})", condition.Substring(0, condition.Length - 1)); } using (SqlConnection con = newSqlConnection(conString)) { using (SqlCommand cmd = newSqlCommand(query + condition)) { using (SqlDataAdapter sda = newSqlDataAdapter(cmd)) { cmd.Connection = con; using (DataTable dt = newDataTable()) { sda.Fill(dt); GridView1.DataSource = dt; GridView1.DataBind(); } } } } } protectedvoid OnPageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex; this.BindGrid(); }
ویژوال بیسیک
ProtectedSub Page_Load(sender AsObject, e AsEventArgs) HandlesMe.Load IfNotMe.IsPostBack Then Me.BindGrid() EndIf EndSub PrivateSub BindGrid() Dim conString AsString = ConfigurationManager.ConnectionStrings("constr").ConnectionString Dim query AsString = "SELECT ContactName, Country FROM Customers" Dim condition AsString = String.Empty ForEach item AsListItemIn lstCountries.Items condition += If(item.Selected, String.Format("'{0}',", item.Value), "") Next IfNotString.IsNullOrEmpty(condition) Then condition = String.Format(" WHERE Country IN ({0})", condition.Substring(0, condition.Length - 1)) EndIf Using con AsNewSqlConnection(conString) Using cmd AsNewSqlCommand(query & condition) Using sda AsNewSqlDataAdapter(cmd) cmd.Connection = con Using dt AsNewDataTable() sda.Fill(dt) GridView1.DataSource = dt GridView1.DataBind() EndUsing EndUsing EndUsing EndUsing EndSub ProtectedSub OnPageIndexChanging(sender AsObject, e AsGridViewPageEventArgs) GridView1.PageIndex = e.NewPageIndex Me.BindGrid() EndSub
کنترل رویداد SelectedIndexChanged مربوط به ListBox
رویداد زیر زمانی که اشیای ListBox انتخاب یا عدم انتخاب میشوند اجرا میشود. در داخل این رویداد GridView دوباره پر میشود تا موارد بتوانند بر اساس آخرین انتخاب ها فیلتر شوند.
سی شارپ
protectedvoid Country_Selected(object sender, EventArgs e) { this.BindGrid(); }
ویژوال بیسیک
ProtectedSub Country_Selected(sender AsObject, e AsEventArgs) Me.BindGrid() EndSub
موفق باشید !
سلام
لینک اشکال داره. درستش بدین صورته:
https://dl.mspsoft.com/s3/User/Farokhi/2015/7/FilterGridViewListBox_www.mspsoft.com.zip
۵
خیلی ممنون !
اصلاح شد !
۹