首页 > 代码库 > 三级联动

三级联动

  

一、三级联动思路

   首先,加载第一级的数据,当第一级选项发生变化的时候,清空第二级和第三级的选项,然后根据第一级选择的项绑定第二级的值。当第二级选项发生变化的时候,清空第三级的数据,并根据第二级选项值绑定第三级的数据。

二、数据库设计

  一般实现三级联动数据库的设计都是设置为3个字段。id(下一级数)、name(名字),pid(本身的级数),但是即使不这样设置表,还是可以通过其他方式实现的。

三、 三级联动几种实现

1.ASP.net控件——DropdownList && AutoPostback实现

  在Form中添加三个DropdownList控件。并且为第一级和第二级注册 选项改变 的事件,注册了事件,要把AutopostBack设置为true。

城市:<asp:DropDownList ID="DropDownList1" Width="155px" Height="25px" runat="server"      AutoPostBack="true" name="dpCity" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">     </asp:DropDownList>线路:<asp:DropDownList ID="DropDownList2" name="dpLine" runat="server" Width="155px" Height="25px"     AutoPostBack="true" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged">     </asp:DropDownList>站点:<asp:DropDownList ID="DropDownList3" name="dpStation" Width="155px" Height="25px"     AutoPostBack="true" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged">     </asp:DropDownList>

  在后台的实现

protected void Page_Load(object sender, EventArgs e)        {            if (!IsPostBack)            {                            //绑定城市                DataTable dtCity = new HighSearch().GetCitySelect();                DropDownList1.DataSource = dtCity;                DropDownList1.DataValueField = "citycode";                DropDownList1.DataTextField = "cityname";                DataBind();                DropDownList1.Items.Insert(0, new ListItem("请选择城市", ""));                DropDownList2.Items.Insert(0, new ListItem("请选择线路", ""));                DropDownList3.Items.Insert(0, new ListItem("请选择站点", ""));                           }                  }        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)        {            if (DropDownList1.SelectedValue != "")            {                DataTable dtLine = new HighSearch().GetLineSelect(DropDownList1.SelectedValue);                DropDownList2.DataSource = dtLine;                DropDownList2.DataValueField = "linecode";                DropDownList2.DataTextField = "linename";                DataBind();                DropDownList2.Items.Insert(0, new ListItem("请选择线路", ""));                DropDownList3.Items.Clear();                DropDownList3.Items.Insert(0, new ListItem("请选择站点", ""));            }            else            {                DropDownList2.Items.Clear();                DropDownList2.Items.Insert(0, new ListItem("请选择线路", ""));                DropDownList3.Items.Clear();                DropDownList3.Items.Insert(0, new ListItem("请选择站点", ""));            }        }        protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)        {             if (DropDownList2.SelectedValue != "")            {                DataTable dtStation = new HighSearch().GetStationSelect(DropDownList2.SelectedValue);                DropDownList3.DataSource = dtStation;                DropDownList3.DataValueField = "stationcode";                DropDownList3.DataTextField = "stationname";                DataBind();                DropDownList3.Items.Insert(0, new ListItem("请选择站点", ""));            }            else            {                DropDownList3.Items.Clear();                DropDownList3.Items.Insert(0, new ListItem("请选择站点", ""));            }        }}

  这种方法要注意的是,记得把AutopostBack属性设置为true,并且把DropdownList放在Form表单中。

2.ASP.net控件——DropdownList && ajax实现

  用ajax的方式获取数据绑定。前台如下:

城市:<asp:DropDownList ID="DropDownList1" Width="155px" Height="25px" runat="server" >     </asp:DropDownList>线路:<asp:DropDownList ID="DropDownList2" name="dpLine" runat="server" Width="155px" Height="25px">     </asp:DropDownList>站点:<asp:DropDownList ID="DropDownList3" name="dpStation" Width="155px" Height="25px">     </asp:DropDownList>

  用Jquery,ajax获取绑定数据,ajax请求返回的是Json格式的数据。下拉框的选项改变用的是juery的change事件。

 context.Response.ContentType = "application/json";            string rank = string.Empty;            string code=string .Empty ;            if (!string.IsNullOrEmpty(context.Request.QueryString["rank"]))            {                rank=context .Request .QueryString["rank"];             }            if (!string.IsNullOrEmpty(context.Request.QueryString["code"]))            {                code =context .Request .QueryString ["code"];            }            DataTable dt = new DataTable();            switch (rank )            {                                case "1":                    dt = new HighSearch().GetCitySelect();break ;                case "2":                    dt = new HighSearch().GetLineSelect(code);break ;                case "3":                    dt = new HighSearch().GetStationSelect(code );break ;            }            string json = JsonConvert.SerializeObject(dt);            context.Response.Write(json);
ajax请求
var ddCity = $(‘#DropDownList1‘);            var ddLine = $(‘#DropDownList2‘);            var ddStation = $(‘#DropDownList3‘);            $(‘<option value="">请选择城市</option>‘).appendTo(ddCity);            $(‘<option value="">请选择线路</option>‘).appendTo(ddLine);            $(‘<option value="">请选择站点</option>‘).appendTo(ddStation);            $.get(‘DropDownList.ashx‘, { rank: 1 }, function (data) {                $(data).each(function () {                    $(‘<option value="http://www.mamicode.com/‘ + this.citycode + ‘">‘ + this.cityname + ‘</option>‘).appendTo(ddCity);                });            });            $(‘#DropDownList1‘).change(function () {                var citycode = $(‘#DropDownList1‘).val();                $(‘#DropDownList2 option‘).remove();                $(‘#DropDownList3 option‘).remove();                $.get(‘DropDownList.ashx‘, { rank: 2, code: citycode }, function (data) {                    $(‘<option value="">请选择线路</option>‘).appendTo(ddLine);                    $(‘<option value="">请选择站点</option>‘).appendTo(ddStation);                    $(data).each(function () {                        $(‘<option value="http://www.mamicode.com/‘ + this.linecode + ‘">‘ + this.linename + ‘</option>‘).appendTo(ddLine);                    });                });            });            $(‘#DropDownList2‘).change(function () {                var linecode = $(‘#DropDownList2‘).val();                $(‘#DropDownList3 option‘).remove();                $.get(‘DropDownList.ashx‘, { rank: 3, code: linecode }, function (data) {                    $(‘<option value="">请选择站点</option>‘).appendTo(ddStation);                    $(data).each(function () {                        $(‘<option value="http://www.mamicode.com/‘ + this.stationcode + ‘">‘ + this.stationname + ‘</option>‘).appendTo(ddStation);                    });                });            });

  当时报这个错。

    回发或回调参数无效 

  改正方法就是把asp:DropDownList 改为select ,保留 runat="server"这个属性,它还是服务器控件,还是能在后台获取值,修改后的Html和获取的方法如下:

        城市:        <select name="ddcity" Width="155px" Height="25px" ID="DropDownList1" runat="server">        </select>        线路:        <select name="ddline" Width="155px" Height="25px" ID="DropDownList2" runat="server">        </select>        站点:        <select name="ddstation" Width="155px" Height="25px" ID="DropDownList3" runat="server">        </select>
 string city = Request["DropDownList1"];
string line = Request["DropDownList2"]; string station = Request["DropDownList3"];

3.html——select option && ajax实现

  这种方法与上面的方法很类似,在上面实例中把runat="server"去掉,JQuery 代码还是这样写。后台就不能这么取数据了而已。

4.html——ul li 列表 && ajax 实现

  因为要做响应式的页面,手机端和PC端一套代码都有好的展示,所有我就用的bootstrap的框架。我没有找到select和option这种dropdownList的UI和控件。所以就用的bootstrap的ul和li列表的方式实现的下拉。

  手机端看的效果

  

  PC端看的效果

  

  因为bootstrap是用的ul和li进行的布局,只好尝试拼。

  

 $.get(‘DropdownList.ashx‘, { rank: 1 }, function (data) {                var ulcity = $(‘#ulCity‘);                $(data).each(function () {                    $(‘<li value="http://www.mamicode.com/‘ + this.citycode + ‘"><a>‘ + this.cityname + ‘</a></li>‘).appendTo(ulcity);                });                $(‘#ulCity li‘).each(function () {                    $(this).click(function () {                        var txt = $(this).children(‘a‘).text();                        $(‘#txtCity‘).val(txt);                        var city = $(this).attr(‘value‘);                        if (city != citycode) {                            citycode = city;                            //绑定线路                            $.get(‘DropdownList.ashx‘, { rank: 2, code: citycode }, function (data) {                                var ulLine = document.getElementById(‘ulLine‘);                                var ulStation = document.getElementById(‘ulStation‘);                                ulStation.innerHTML = ‘‘; //清空站点                                ulLine.innerHTML = ‘‘; //清空线路                                $(‘#txtLine‘).val(‘‘);                                $(‘#txtStation‘).val(‘‘);                                linecode = ‘‘;                                stationcode = ‘‘;                                $(data).each(function () {                                    $(‘<li value="http://www.mamicode.com/‘ + this.linecode + ‘"><a>‘ + this.linename + ‘</a></li>‘).appendTo(ulLine);                                });                                $(‘#ulLine li‘).each(function () {                                    $(this).click(function () {                                        var txt2 = $(this).children(‘a‘).text();                                        $(‘#txtLine‘).val(txt2);                                        var line = $(this).attr(‘value‘);                                        if (line != linecode) {                                            linecode = line;                                            ulStation.innerHTML = ‘‘;                                            stationcode = ‘‘;                                            $(‘#txtStation‘).val(‘‘);                                            //绑定站点                                            $.get(‘DropdownList.ashx‘, { rank: 3, code: linecode }, function (data) {                                                $(data).each(function () {                                                    $(‘<li value="http://www.mamicode.com/‘ + this.stationcode + ‘"><a>‘ + this.stationname + ‘</a></li>‘).appendTo(ulStation);                                                });                                                $(‘#ulStation li‘).each(function () {                                                    $(this).click(function () {                                                        var txt3 = $(this).children(‘a‘).text();                                                        $(‘#txtStation‘).val(txt3);                                                        stationcode = $(this).attr(‘value‘);                                                    })                                                });                                            });                                        }                                    });                                });                            });                        }                    });                });            });
View Code

  最终还是实现了三级联动的效果。

  三级联动的功能很常用,但是我是第一次写。四种方法比较,我觉得最好用的是第一种。但是第一中用到了AutopostBack,如果同时又要提交表单,这种方式就比较麻烦了。第二种没有多少意义,第三种比起第二种好一点。第四种是最好不要这样用。