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类,直接奔主题。

posted @ 2012-02-22 15:30  Bradwarden  阅读(1692)  评论(0编辑  收藏  举报