asp.net 中如何对 <dropdownlist>实现多级联动,并且点下面的按钮点击的时候,我还想把它的值给取出来 描述:首先,页面加载的时候出现一个 <dropdownlist>,并从数据库中查出数据,把值绑定到 <dropdownlist>   当我选中 <dropdownlist>的值时,把它的子节点的值查出来,如果有值的话,就为他生成一个 <dropdownlist>   并把查出来的值给他绑定上。   如果选中第二个 <dropdownlist>的时候,把它的子节点的值查出来,如果有值的话,就为他生成一个 <dropdownlist>   并把查出来的值给他绑定上 依次类推,总之他有多少子节点,我们就为他动态生成 <dropdownlist>,并且绑定。 最下面的按钮点击的时候,我还想把它的值给取出来,(只要有 <dropdownlist>。我都想取他的值) 请大家指教,多多帮忙,谢谢。

解决方案 »

  1.   

    很简单,AJAX
    放在UpdatePanel里,将选择回调设置为true,事件里写根据第一个绑定第二个就行了
      

  2.   

    参考:Ajax实现无刷新三联动下拉框 
    http://singlepine.cnblogs.com/articles/257954.html?page=1
      

  3.   

    1如果关联超过三个使用树控件比这效果好. 
    2如果三个一下 你可以设置 dropdownlist.AutoPostBack = true;
    然后把帮定方法写到 SelectedIndexChanged事件里
      

  4.   

    第一个dropdownlist的selectindexchanged事件.根据第一个ddl的selectedvalue生成sql,得到datatable
    然后DropDownList ddl1 = new  DropDownList();
    ddl1.DataSrouce  = dt.DefaultView;
    ddl1.DataBind();
    this.Panel1.Contorls.Add(ddl1);//
    这里可以ViewState中记录一下控件的个数.在Page_Load时根据这个个数,重新再生成这些dropdownlist,否则页面提交时控件会消失.
    ddl1.SelectedIndexChanged+= new 事件. void ddl1_SelectedIndexChanged(object sender, EventArgs e)
            {
                 再继续绑定.
                
            }
      

  5.   

    在vs 2008 里面有<UpdatePanel> 和<scriptmanger> 把他们放到这里就可以了。我帮你做做。== 
      

  6.   

    private void BindDc() 
        { 
            //第一个 
            ddl1.DataSource = bna.GetPro(); 
            ddl1.DataTextField = "areaname"; 
            ddl1.DataValueField = "ID"; 
            ddl1.DataBind(); 
            if (ddl1.DataSource != null) 
                ddl1.Attributes.Add("onchange", "showNext(this.options[this.selectedIndex].value,'"+ddl2.ClientID+"');"); 
            //可以先判断 DropDownList.SelectedItem.Value 
            //第二个 
            int oneid = Convert.ToInt32(ddl1.SelectedItem.Value); 
            ddl2.DataSource = bna.GetPro(oneid); 
            ddl2.DataTextField = "areaname"; 
            ddl2.DataValueField = "ID"; 
            ddl2.DataBind();         //第三个 
            if (ddl2.DataSource != null) ddl2.Attributes.Add("onchange", "showNext(this.options[this.selectedIndex].value,'"+ddl3.ClientID+"');"); 
            int oneTwo = Convert.ToInt32(ddl2.SelectedItem.Value); 
            ddl3.DataSource = bna.GetNext(oneTwo); 
            ddl3.DataTextField = "areaname"; 
            ddl3.DataValueField = "ID"; 
            ddl3.DataBind(); 
        } 
      

  7.   

    你可以参考下这个帖子.http://topic.csdn.net/u/20090413/09/2d31ecd1-b938-4516-936b-96322b8197ca.html
      

  8.   


    1.asp.net建立一个AjaxControlTookit web site项目。2.拖一个UpdatePanel,并设置id="panel1";3.拖一个Dropdownlist(或是ListBox)到panel1中,并设置id="List2",及AutoPostBanck=True;该panel中的下拉菜单为二级菜单。4.拖一个Dropdownlist(或是ListBox)到panel1中或是外面都行,并设置id="List1",该下拉菜单为一级菜单。5.设置ScriptManager1的EnablePartialRendering=True;6.Page_load添加一级菜单内容。(主要代码)  sqlDataAdapter oda= new    sqlDataAdapter ();  oda.SelectCommand= new SqlCommand("sql语句",conn)  DataSet ds= new DataSet();  oda.Fill(ds,"yjcd");   List1.DataSource=ds.Tables["yjcd"];   List1.DataTextField="绑定的数据库字段名"   Lst1.DataBind();7.一级下拉菜单事件。(主要代码) List1_selectIndexChanged(Objec source,EnventArgs e){  String fenlei=List1.SelectedValue.ToString();  oda.SelectCommand=new sqlCommand("sql语句",conn);  //绑定数据代码同上}9.最后UpdataPanel,panel1中的 Triggers,添加AutoPostBack   ControlID=List1;EnventName=List1_SelectedIndexChanged10.添加一级下拉菜单List1属性AppendDataBoundItems=True;AutoPostBack=True;
      

  9.   

    http://www.ossforge.com/html/ajax/20071018/26564.html
      

  10.   

    <UpdatePanel> 和 <scriptmanger> 把他们放到这里
    在selectIndexChanged事件里写相关操作
      

  11.   

    ASP.NET给我们带了了事件模型的编程机制,这使得我们将所有的任务都放在服务器上执行哪怕是一个小小变动,其实这到不是什么问题,可是有一点我们无法忍受,如果我们改变某一个输入框中的内容页面要刷新,改变DropDownlist的选择项需要更新另一个Dropdownlist需要刷新,真是郁闷。   
                    下面我将描述一种原始的方法,之所以说它原是是因为这种方法在ASP.NET之前就已经有了,我想这两者之间的关系我不必详细描述,我们今天要说的是如何不刷新页面更新DropDownList,该方法旨在抛砖引玉,其实使用该方法可以实现许多不刷新网页就和后台交互的应用,好了废话就不说了,看看我们的例子吧,首先我们需要一个放置两个DropDownList的页面,假如它叫WebForm2.aspx,页面的代码如下:   
      <%@   Page   language="c#"   Codebehind="WebForm2.aspx.cs"   AutoEventWireup="false"   Inherits="WebApptest1.WebForm2"   %>   
      <!DOCTYPE   HTML   PUBLIC   "-//W3C//DTD   HTML   4.0   Transitional//EN"   >   
      <HTML>   
        <HEAD>   
          <title>WebForm2</title>   
          <meta   content="Microsoft   Visual   Studio   .NET   7.1"   name="GENERATOR">   
          <meta   content="C#"   name="CODE_LANGUAGE">   
          <meta   content="JavaScript"   name="vs_defaultClientScript">   
          <meta   content="http://schemas.microsoft.com/intellisense/ie5"   name="vs_targetSchema">   
          <script>   
                  function   load(state){   
                    var   drp2   =   document.getElementById("DropDownList2");   
                    for(var   i   =   0;i<=drp2.options.length   -1;i++){   
              drp2.remove(i);   
                    }   
                                                              var   oHttpReq   =   new   ActiveXObject("MSXML2.XMLHTTP");   
                    var   oDoc   =   new   ActiveXObject("MSXML2.DOMDocument");   
                    oHttpReq.open("POST",   "webform6.aspx?state="+state,   false);   
                    oHttpReq.send("");   
                    result   =   oHttpReq.responseText;   
                    oDoc.loadXML(result);   
                    items   =   oDoc.selectNodes("//CITY/Table");   
                    for   (var   item   =   items.nextNode();   item;   item   =   items.nextNode()){   
              var   city   =   item.selectSingleNode("//city").nodeTypedValue;   
              var   newOption   =   document.createElement("OPTION");   
              newOption.text   =   city;   
              newOption.value   =   city;   
              drp2.options.add(newOption);   
                    }   
                  }   
          </script>   
        </HEAD>   
        <body   MS_POSITIONING="flowLayout">   
          <form   id="Form1"   method="post"   runat="server">   
            <asp:DropDownList   id="DropDownList1"   runat="server"></asp:DropDownList>   
            <asp:DropDownList   id="DropDownList2"   runat="server"></asp:DropDownList>   
          </form>   
        </body>   
      </HTML>   
        
                      上面的页面中有两个DropDownList和一段js脚本,该脚本可以直接写在页面也可以写在后台在Regeist到页面上(后者更灵活一些)该页的后台代码如下所示,在Page_Load里面写如下的代码:   
        if(!this.IsPostBack){   
          SqlConnection   con   =   new   SqlConnection("server=localhost;database=pubs;uid=sa;pwd=sa;");   
          SqlDataAdapter   da   =   new   SqlDataAdapter("select   state   from   authors   group   by   state",con);   
          DataSet   ds   =   new   DataSet();   
          this.DropDownList1.DataTextField   =   "State";   
          this.DropDownList1.DataValueField   =   "State";   
          this.DropDownList1.DataBind();   
          this.DropDownList1.Attributes.Add("onchange","load(this.options[this.selectedIndex].innerText)");   
        }   
                    在上面的代码中我们做了两件事情:1、帮定其中一个DropDownList(你也可以同时绑定两个)。2、指定该控件的客户端脚本。下面我们详细介绍一下上面的js代码,首先得到页面上要联动的DorpDownList对象,将他的Options清空,再创建两个客户端对象oHttpReq和oDoc对象,其中一个负责发送请求另一个负责得到响应结果,我们将用户选择的State发送到名为WebForm6.aspx的页面,该页面将处理这个请求并返回一个响应,该响应的结果是一个XML文件,稍候介绍WebForm6.aspx里面的代码。我们将返回的结果使用loadXML方法Load到oDoc对象里面,然后就可以使用selectNodes方法得到所有的city节点,接着循环这些节点在客户端创建Option对象,最后将这些Option对象Add到DropDwonList2里面去。   
                      下面我们看看WebFowm6.aspx都做了些什么事情,该页面的HTML页面是一个除了包括<@Page>指令意外什么都没有的页面,后台的Page_Load代码如下:   
        private   void   Page_Load(object   sender,   System.EventArgs   e){   
          //   Put   user   code   to   initialize   the   page   here   
          if(this.Request["state"]!=null){   
          string   state   =   this.Request["state"].ToString();   
          SqlConnection   con   =   new   SqlConnection("server=localhost;database=pubs;uid=sa;pwd=sa;");   
          SqlDataAdapter   da   =   new   SqlDataAdapter("select   city   from   authors   where   state   =   '"+state+"'",con);   
          DataSet   ds   =   new   DataSet("CITY");   
          da.Fill(ds);   
          XmlTextWriter   writer   =   new   XmlTextWriter(Response.OutputStream,   Response.ContentEncoding);   
          writer.Formatting   =   Formatting.Indented;   
          writer.Indentation   =   4;   
          writer.IndentChar   =   '   ';   
          ds.WriteXml(writer);   
          writer.Flush();   
          Response.End();   
          writer.Close();   
        }   
                        该方法得到用户选择的state通过查询以后得到一个DataSet对象,使用该对象的WriteXML方法直接将内容写到Response.OutputStream里面然后传递到客户端,客户端的load方法通过result   =oHttpReq.responseText;句话得到一个XML字符串,最后解析此串。