动态添加下拉列表,并通过回传记住他们 [英] Dynamically add drop down lists and remember them through postbacks
问题描述
我试图找出实现这一目标的最佳方式:
我要显示一个下拉列表页面加载时,默认选择的值是什么,或空元素(如 - )。当用户从列表中选择一个值,另一个下拉列表中加入第一个的下方,并依此类推。
我这个问题是你如何使页面记住下拉通过回传和值创建的列表他们选择?我一定要使用某种类型的阵列来存储他们的东西?
非常感谢你。
编辑:我做了这个例子动态添加下拉列表和它们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的=服务器>
< DIV>
< 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< DdlIndex;我++){
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屋!