动态添加下拉列表,并通过回传记住他们 [英] Dynamically add drop down lists and remember them through postbacks

查看:259
本文介绍了动态添加下拉列表,并通过回传记住他们的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出实现这一目标的最佳方式:

我要显示一个下拉列表页面加载时,默认选择的值是什么,或空元素(如 - )。当用户从列表中选择一个值,另一个下拉列表中加入第一个的下方,并依此类推。

我这个问题是你如何使页面记住下拉通过回传和值创建的列表他们选择?我一定要使用某种类型的阵列来存储他们的东西?

非常感谢你。

编辑:我做了这个例子动态添加下拉列表和它们suscribe事件处理程序,但该事件将不会触发。

编辑2:改变了code,因为我标示VB.Net,并张贴在C#中的东西。我与一些琐碎的改进更新code,但不会触发事件:(

 私人myDdlArray作为新的列表(中的DropDownList)保护小组的Page_Load(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手Me.Load    如果(会话(DDL)是没有什么)然后
        会议(DDL)= myDdlArray
    万一    如果(会话(ddlcount)是没有什么)然后
        会议(ddlcount)= 0
    万一    myDdlArray = CTYPE(会议(DDL),列表(中的DropDownList))    昏暗myDdl作为新的DropDownList
    myDdl =新的DropDownList
    对于每个myDdl在myDdlArray
        panel.Controls.Add(myDdl)
        panel.Controls.Add(新LiteralControl(< BR />中))
    下一个    会议(DDL)= myDdlArray结束小组保护小组btn_Click(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手btn.Click    myDdlArray = CTYPE(会议(DDL),列表(中的DropDownList))
    昏暗ddlCount作为整数= CINT(会议(ddlcount))+ 1    昏暗newDdl作为新的DropDownList
    newDdl.ID =的String.Format(ddlNPKMaterial {0},ddlCount)
    newDdl.AutoPostBack = TRUE    AddHandler的newDdl.SelectedIndexChanged,AddressOf cbo_SelectedIndexChanged    newDdl.Items.Add(乌诺)
    newDdl.Items.Add(DOS)
    newDdl.Items.Add(特雷斯)    myDdlArray.Add(newDdl)    panel.Controls.Clear()    昏暗myDdl作为新的DropDownList
    myDdl =新的DropDownList
    对于每个myDdl在myDdlArray
        panel.Controls.Add(myDdl)
        panel.Controls.Add(新LiteralControl(< BR />中))
    下一个    会议(DDL)= myDdlArray
    会议(ddlcount)= ddlCount + 1结束小组保护小组btnReset_Click(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手btnReset.Click    会议(DDL)=没有
    会议(ddlcount)=没有结束小组保护小组btnShow_Click(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手btnShow.Click    插入大脑在这里结束小组公用Sub cbo_SelectedIndexChanged(BYVAL发件人为对象,BYVAL E上System.EventArgs)    的Response.Write(CTYPE(发件人,DropDownList的).ID)结束小组保护小组Page_ preRender(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手我。preRender    如果(会话(DDL)是没有什么)然后
        panel.Controls.Clear()
    万一结束小组

在ASPX我有:

 <表ID =form1的=服务器>
< D​​IV>
    < ASP:按钮的ID =BTN=服务器文本=添加/>
    < ASP:按钮=服务器ID =btnShow文本=告诉我/>
    < ASP:按钮=服务器ID =btnReset文本=重置/>
    < BR />
    < ASP:面板=服务器ID =面板>
        < ASP:GridView控件=服务器ID =GRD>
            <柱体和GT;
                < ASP:BoundField的的HeaderText =ID数据字段=ID/>
            < /专栏>
        < / ASP:GridView的>
    < / ASP:面板>
< / DIV>
< /表及GT;


解决方案

我会使用的OnLoad 来重新创建控件,但如果你没有存储的#在ViewState中的控制(你可以把它变成会议上,HiddenField,Cookie等),那么你可以做到这一点在的OnInit 。无论哪种方式应该还是触发回发事件。

 < ASP:占位符ID =phDdl=服务器>
    < ASP:DropDwonList ID =DDL=服务器
     OnSelectedIndexChanged =ddl_SelectedIndexChanged/>
< / ASP:占位符><脚本=服务器>
    INT DdlIndex {
       获得{
          对象o =的ViewState [_ ddlIndex];
          如果(O == NULL){
             的ViewState [_ ddlIndex] = 0;
          }
          回报(INT)的ViewState [_ ddlIndex];
       }
       集合{
          的ViewState [_ ddlIndex] =值;
       }
    }    保护覆盖无效的OnLoad(EventArgs的发送){
       base.OnLoad(E);
       的for(int i = 0; I< D​​dlIndex;我++){
          AddDropDownList(ⅰ);
       }
    }    无效ddl_SelectedIndexChanged(对象发件人,EventArgs的发送){
       VAR DDL =(DropDownList的)寄件人;
       如果(ddl.SelectedIndex大于0){
          AddDropDownList(DdlIndex ++);
       }
    }    无效AddDropDownList(int i)以{
       VAR DDL =新的DropDownList();
       ddl.Id =的String.Format(DDL {0},我);
       ddl.SelectedIndexChanged + = ddl_SelectedIndexChanged;
       //添加项目
       phDdls.Add(DDL);
    }
< / SCRIPT>

I'm trying to figure out the best way to achieve this:

I need to show a drop down list when the page loads, the default selected value is nothing, or an empty element (such as "-"). When the user selects one value from the list, another drop down list is added below the first one, and so on.

My problem with this is how you make the page to remember the drop down lists created through postbacks and the values they have selected? Do I have to use some kind of array to store them or something?

Thank you very much.

EDIT: I did this example for dynamically add drop down lists and suscribe them to an event handler but the event won't fire.

EDIT 2: Changed the code because I labelled for VB.Net and posted something in C#. I update the code with some trivial improvements, but still won't fire the event :(

    Private myDdlArray As New List(Of DropDownList)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If (Session("ddl") Is Nothing) Then
        Session("ddl") = myDdlArray
    End If

    If (Session("ddlcount") Is Nothing) Then
        Session("ddlcount") = 0
    End If

    myDdlArray = CType(Session("ddl"), List(Of DropDownList))

    Dim myDdl As New DropDownList
    myDdl = New DropDownList
    For Each myDdl In myDdlArray
        panel.Controls.Add(myDdl)
        panel.Controls.Add(New LiteralControl("<br/>"))
    Next

    Session("ddl") = myDdlArray

End Sub

Protected Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn.Click

    myDdlArray = CType(Session("ddl"), List(Of DropDownList))
    Dim ddlCount As Integer = CInt(Session("ddlcount")) + 1

    Dim newDdl As New DropDownList
    newDdl.ID = String.Format("ddlNPKMaterial{0}", ddlCount)
    newDdl.AutoPostBack = True

    AddHandler newDdl.SelectedIndexChanged, AddressOf cbo_SelectedIndexChanged

    newDdl.Items.Add("Uno")
    newDdl.Items.Add("Dos")
    newDdl.Items.Add("Tres")

    myDdlArray.Add(newDdl)

    panel.Controls.Clear()

    Dim myDdl As New DropDownList
    myDdl = New DropDownList
    For Each myDdl In myDdlArray
        panel.Controls.Add(myDdl)
        panel.Controls.Add(New LiteralControl("<br/>"))
    Next

    Session("ddl") = myDdlArray
    Session("ddlcount") = ddlCount + 1

End Sub

Protected Sub btnReset_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnReset.Click

    Session("ddl") = Nothing
    Session("ddlcount") = Nothing

End Sub

Protected Sub btnShow_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnShow.Click

    ' Insert brain here

End Sub

Public Sub cbo_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

    Response.Write(CType(sender, DropDownList).ID)

End Sub

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

    If (Session("ddl") Is Nothing) Then
        panel.Controls.Clear()
    End If

End Sub

in the aspx I have:

<form id="form1" runat="server">
<div>
    <asp:Button ID="btn" runat="server" Text="Add" />
    <asp:Button runat="server" ID="btnShow" Text="Tell me" />
    <asp:Button runat="server" ID="btnReset" Text="Reset" />
    <br />
    <asp:Panel runat="server" ID="panel">
        <asp:GridView runat="server" ID="grd">
            <Columns>
                <asp:BoundField HeaderText="Id" DataField="Id" />
            </Columns>
        </asp:GridView>
    </asp:Panel>
</div>
</form>

解决方案

I'll use OnLoad to recreate the controls, but if you're not storing the # of controls in ViewState (you could put it into Session, a HiddenField, Cookie, etc.) then you can do it in OnInit. Either way should still fire the postback event.

<asp:PlaceHolder id="phDdl" runat="server">
    <asp:DropDwonList id="ddl" runat="server" 
     OnSelectedIndexChanged="ddl_SelectedIndexChanged" />
</asp:PlaceHolder>

<script runat="server">
    int DdlIndex {
       get { 
          object o = ViewState["_ddlIndex"];
          if (o == null) {
             ViewState["_ddlIndex"] = 0;
          }
          return (int)ViewState["_ddlIndex"];
       }
       set {
          ViewState["_ddlIndex"] = value;
       }
    }

    protected override void OnLoad(EventArgs e) {
       base.OnLoad(e);
       for (int i = 0; i < DdlIndex; i++) {
          AddDropDownList(i);
       }
    }

    void ddl_SelectedIndexChanged(object sender, EventArgs e) {
       var ddl = (DropDownList)sender;
       if (ddl.SelectedIndex > 0) {
          AddDropDownList(DdlIndex++);
       }
    }

    void AddDropDownList(int i) {
       var ddl = new DropDownList();
       ddl.Id = string.Format("ddl{0}", i);
       ddl.SelectedIndexChanged += ddl_SelectedIndexChanged;
       // add items
       phDdls.Add(ddl);
    }
</script>

这篇关于动态添加下拉列表,并通过回传记住他们的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆