dropdownList级联刷新gridView
有一种需求,样子大概是这样的
根据不同的选择条件进行筛选,根据筛选条件动态的显示结果,在本次应用程序中筛选的结果是放在gridview中显示,
本demo实现根据用户从下拉框中选择的数据对gridview进行数据筛选,下拉框数据从数据库中获取。
前台页面,定义一个dropdownlist和gridview就行了:
<div> <asp:DropDownList ID="DropDownList1" runat="server" onselectedindexchanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True"> </asp:DropDownList> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div>
后台代码:绑定gridview数据大家根据自己情况写了。
如果你是用gridview的话下面2步就比较坑爹了,所以很多时候都不用gridview显示数据了。比较好的显示数据方法在.net中用repeater,都是被gridview折磨的人啊。
言归正传,首先:定义一个model类,和dataset里面的数据对应,后面将dateTable转换成list时用。
/// <summary> /// model类里面的两个属性其实是dropdownlist的Name和Value属性。在本例中两个属性都一样。 /// </summary> class ToolDataModel { public string Name { get; set; } public string Value { get; set; } }
//将dataTable转换成list的model集合,并去掉list中重复项,用于绑定dropdownlist. private List<ToolDataModel> DataTableToList(DataTable dt) { List<ToolDataModel> modelList = new List<ToolDataModel>(); int rowsCount = dt.Rows.Count; if (rowsCount > 0) { ToolDataModel model; //遍历为list初始出 for (int n = 0; n < rowsCount; n++) { model = new ToolDataModel(); if (dt.Rows[n]["m__strToolName"] != null && dt.Rows[n]["m__strToolName"].ToString() != "") { model.Name = dt.Rows[n]["m__strToolName"].ToString(); } if (dt.Rows[n]["m__strToolName"] != null && dt.Rows[n]["m__strToolName"].ToString() != "") { model.Value = dt.Rows[n]["m__strToolName"].ToString(); } modelList.Add(model); } } //去除list中重复项,这是一个很简单的算法,一看就懂了 for (int i = 0; i < modelList.Count; i++) { for (int j = i + 1; j < modelList.Count; j++) { if (modelList[i].Name == modelList[j].Name) { modelList.RemoveAt(modelList.LastIndexOf(modelList[i])); } } } return modelList; }
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindView(); } } private void BindView() { GridView1.DataSource = DataTest.BindData(); GridView1.DataBind(); //将datatable转换成list集合再绑定数据,ToolDataModel是model类 List<ToolDataModel> lstItems = DataTableToList(DataTest.BindData().Tables[0]); //本来是想用linq去掉dropdownlist中重复值,如下面代码,但是linq的distinct很坑爹,所以自己写了一个。 //var query = (from data in lstItems // select data).Distinct<ToolDataModel>(); DropDownList1.DataSource = lstItems; //这里绑定model类里的两个属性。看出来为什么要设置name和value两个属性了吧。 DropDownList1.DataTextField = "Name"; DropDownList1.DataValueField = "Value"; DropDownList1.DataBind(); } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { DataView dv = new DataView(); dv = DataTest.BindData().Tables[0].DefaultView; //m__strToolName是dataSet的一个属性,用DataView的RowFilter属性筛选dataset dv.RowFilter = "m__strToolName=" + DropDownList1.SelectedValue; GridView1.DataSource = dv; GridView1.DataBind(); }
很简单的demo,希望对大家有所帮助,有更好的方法,欢迎大家留言。
注:如果确定dropdownlist中没有重复值,则可以不用辅助类也不用设置一个model类,直接奔主题。