<asp:UpdatePanel runat="server" ID="ddl_list">
  <ContentTemplate>
    <asp:DropDownList ID="ddl_root" runat="server" OnSelectedIndexChanged="showChildList" AutoPostBack="true">
    </asp:DropDownList>
  </ContentTemplate>
</asp:UpdatePanel>我在aspx文件中添加如上代码,showChildList函数如下:
    protected void showChildList(object sender, EventArgs e)
    {
        DropDownList ddl_now = (DropDownList)sender;
        string sql = "select part_id,part_name from tb_Parts where root_id='" + ddl_now.SelectedValue.ToString() + "'";
        SqlDataReader DR = means.getcom(sql);
        if (DR.HasRows)
        {
            DropDownList ddl_new = new DropDownList();
            ddl_new.SelectedIndexChanged += new System.EventHandler(this.ChildList);
            ddl_new.AutoPostBack = true;
            ListItem li = new ListItem();
            li.Value = "-1";
            li.Text = "请选择栏目...";
            li.Selected = true;
            ddl_new.Items.Add(li);
            while (DR.Read())
            {
                ListItem li2 = new ListItem();
                li2.Value = DR["part_id"].ToString();
                li2.Text = DR["part_name"].ToString();
                ddl_new.Items.Add(li2);
            }
            ddl_now.Parent.Controls.Add(ddl_new);
        }
    }
我要实现的功能是当下拉框中的选择项改变时,到数据库中查找所选项目是否有子菜单,如果有则添加一个下拉框,在其中添加所有子菜单,如此循环。但是运行之后,我选择第一个下拉框的相应项目之后,局部刷新,添加了下拉框,在第二个下拉框中选择后就直刷新页面了,第二个下拉框也没有了。不知是哪里出了问题。还有请问 “ddl_now.Parent.Controls.Add(ddl_new);” 是实现了将新的DropDownList控件加入到<ContentTemplate>标签里吗?

解决方案 »

  1.   

    局部刷新的地方全部加上updatePanel
      

  2.   


    那我第二个DropDownList在事件中添加的,也要加UpadatePanel吗?不是直接添加在原有的UpadatePanel里吗?
      

  3.   

    DropDownList ddl_new = new DropDownList();
     没把这个DropDownList 放到updatePanel中去,建议在页面上先放好DropDownList并隐藏掉,选择的时候显示它要好点哦
      

  4.   


    但是第二个下拉框就已经不是局部刷新了,似乎不执行showChildList()函数
      

  5.   

    ddl_now.Parent.Controls.Add(ddl_new);没有实现将ddl_new加到updatePanel中吗?那是加到了哪呢?
      

  6.   

    <asp:UpdatePanel runat="server" ID="ddl_list">
      <ContentTemplate>
    <div>
      <asp:DropDownList ID="ddl_root" runat="server" OnSelectedIndexChanged="showChildList" AutoPostBack="true">
      </asp:DropDownList>
    </div>
      </ContentTemplate>
    </asp:UpdatePanel>
    莫非要这样?
      

  7.   

    动态添加的控件不会自动保存试图状态。所以每次回发后要重新查询数据创建ddl_new控件
      

  8.   

    跟UpdatePanel没有关系,只不过是玩所谓的“无刷新/不刷新”蒙住了你自己的眼睛。你可以把 ScriptManager 控件的 EnablePartialRendering 属性设置为 false,然后让你的程序正确地处理所谓“动态添加控件”操作。完全作对了,测试通过,才应该将那个属性设置为 true。
      

  9.   


    用js写ajax吧,干脆别用服务端控件了
      

  10.   

    至于刷新某个UpdatePanel,调用它的 Update()方法就行了。
      

  11.   

    这个方法当改变二级菜单时时调用Page_Load()函数吗?能实现局部刷新吗?如果还是要刷新整个页面再重新加载菜单项,就没办法得到我要的效果