Asp.net 动态创建的DropDownList在回发时丢失ListItems
我有一个页面,其中包含一些动态创建的控件(TextBox和DropDownList)。发生回发时,文本框保留其值,但DropDownList丢失其列表项。 这是相当混乱的,因为页面级别的DropDownList也保留了它的ListItems。有人能看到下面的代码有什么问题吗 如果您能帮助解决这个问题,我们将不胜感激Asp.net 动态创建的DropDownList在回发时丢失ListItems,asp.net,vb.net,drop-down-menu,viewstate,Asp.net,Vb.net,Drop Down Menu,Viewstate,我有一个页面,其中包含一些动态创建的控件(TextBox和DropDownList)。发生回发时,文本框保留其值,但DropDownList丢失其列表项。 这是相当混乱的,因为页面级别的DropDownList也保留了它的ListItems。有人能看到下面的代码有什么问题吗 如果您能帮助解决这个问题,我们将不胜感激 <%@ Page Language="VB"%> <script runat="server"> Protected Sub Page_Init(ByV
<%@ Page Language="VB"%>
<script runat="server">
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
ddlFixed.Items.Add(New ListItem("12", "13"))
ddlFixed.Items.Add(New ListItem("14", "15"))
End If
Dim i As Integer
For i = 0 To 3
Dim ddl As New DropDownList
ddl.ID = "ddlPage" & i
ddl.EnableViewState = True
If Not Page.IsPostBack Then
ddl.Items.Add(New ListItem("12", "13"))
ddl.Items.Add(New ListItem("14", "15"))
End If
pnlDynamic.Controls.Add(ddl)
Dim txtBx As New TextBox
txtBx.ID = "txtPage" & i
If Not Page.IsPostBack Then
txtBx.Text = "Preset"
End If
pnlDynamic.Controls.Add(txtBx)
Next
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server" enableviewstate="true">
<div>
<br />
<br />
<a href="Default.aspx">Get-Request</a>
<br />
<br />
<asp:Panel runat="server" ID="pnlDynamic" EnableViewState="true" />
<br />
<br />
<asp:DropDownList runat="server" ID="ddlFixed" />
<asp:Button runat="server" ID="btn" Text="Postback"/>
</div>
</form>
</body>
</html>
受保护的子页_Init(ByVal发送方作为对象,ByVal e作为System.EventArgs)
如果不是Page.IsPostBack,则
ddlixed.Items.Add(新列表项(“12”、“13”))
ddlixed.Items.Add(新列表项(“14”、“15”))
如果结束
作为整数的Dim i
对于i=0到3
将ddl设置为新的下拉列表
ddl.ID=“ddlPage”&i
ddl.EnableViewState=True
如果不是Page.IsPostBack,则
ddl.Items.Add(新列表项(“12”、“13”))
ddl.Items.Add(新列表项(“14”、“15”))
如果结束
pnlDynamic.Controls.Add(ddl)
将txtBx设置为新文本框
txtBx.ID=“txtPage”&i
如果不是Page.IsPostBack,则
txtBx.Text=“预设”
如果结束
pnlDynamic.Controls.Add(txtBx)
下一个
端接头
下拉列表中的列表项不存储在视图状态。你必须在每次回邮中添加它们
视图状态中存储的是所选索引,即控件的“值”
编辑:看来我今天学到了一些东西。我的立场得到纠正:-)您可能需要显式激活那些下拉列表的ViewState 编辑:这就是我最后一句话的意思
<script runat="server">
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
ddlFixed.Items.Add(New ListItem("12", "13"))
ddlFixed.Items.Add(New ListItem("14", "15"))
Dim i As Integer
For i = 0 To 3
Dim ddl As New DropDownList
ddl.ID = "ddlPage" & i
ddl.EnableViewState = True
ddl.Items.Add(New ListItem("12", "13"))
ddl.Items.Add(New ListItem("14", "15"))
pnlDynamic.Controls.Add(ddl)
Dim txtBx As New TextBox
txtBx.ID = "txtPage" & i
txtBx.Text = "Preset"
pnlDynamic.Controls.Add(txtBx)
Next
End If
End Sub
</script>
受保护的子页_Init(ByVal发送方作为对象,ByVal e作为System.EventArgs)
如果不是Page.IsPostBack,则
ddlixed.Items.Add(新列表项(“12”、“13”))
ddlixed.Items.Add(新列表项(“14”、“15”))
作为整数的Dim i
对于i=0到3
将ddl设置为新的下拉列表
ddl.ID=“ddlPage”&i
ddl.EnableViewState=True
ddl.Items.Add(新列表项(“12”、“13”))
ddl.Items.Add(新列表项(“14”、“15”))
pnlDynamic.Controls.Add(ddl)
将txtBx设置为新文本框
txtBx.ID=“txtPage”&i
txtBx.Text=“预设”
pnlDynamic.Controls.Add(txtBx)
下一个
如果结束
端接头
启用viewstate时,DDL将维护其项目和选择。无论viewstate如何,文本框都将保留其内容,因为生成的html会在回发时写回服务器
我发现在代码和标记中包含所有这些viewstate语句是很有趣的
有几件事正在发生:
我总是使用
页面加载
,从来没有遇到过这样的问题。也许你可以看看
我通常在第一次加载页面时将数据绑定到控件,然后让Viewstate处理回发等。请注意,它们建议您在页面加载期间绑定数据
退房
页面事件
loadTOCNode(2,“更多信息”);
在ASP.NET页面的生命周期中,一些标准事件
经常使用从页面对象公开的。ASP.NET页面框架
在运行时自动连接(或连接)适当的代理实例
是时候采用这些方法了。这样你就不用写必要的“胶水”了
下面的列表显示了在
按触发顺序的运行时:
- Page\u Init:在此事件期间,您可以初始化值或连接任何
您可能拥有的事件处理程序。
- 页面加载:在此事件期间,您可以执行一系列操作以
首次创建ASP.NET页面或响应客户端事件
那是一个帖子的结果。页面和控件视图状态已恢复
在此事件之前。使用IsPostBack页面属性检查这是否是
页面正在处理中。如果是第一次,请执行数据绑定。也,
读取并更新控件属性。
- Page\u数据绑定:在页面级别调用数据绑定方法时,会引发数据绑定事件。如果在单个控件上调用DataBind,则它仅触发其下控件的DataBind事件。
- Page\u PreRender:PreRender事件在保存视图状态和
控件被渲染。您可以使用此事件在最后一分钟执行任何操作
控件上的操作。
- 页面卸载:页面完成渲染后,将触发页面卸载事件。此事件是执行最终清理的好地方
工作这包括清理打开的数据库连接,
丢弃对象,或关闭那些打开的文件。
下面的列表概述了正在发生的事件
非确定性:
页面错误:如果在页面处理过程中发生未处理的异常,将触发错误事件。错误事件为您提供了一个优雅地处理错误的机会
错误。第页\u中止事务:如果要指示事务是否已终止,事务事件非常有用
成功或失败。此事件通常用于中的购物车场景
这一事件可以表明项目的成功或失败
CType(ddl.Items, IStateManager).TrackViewState()
<%@ Page Language="VB"%>
<script runat="server">
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
ddlFixed.Items.Add(New ListItem("12", "13"))
ddlFixed.Items.Add(New ListItem("14", "15"))
End If
Dim i As Integer
For i = 0 To 3
Dim ddl As New DropDownList
ddl.ID = "ddlPage" & i
CType(ddl.Items, IStateManager).TrackViewState()
If Not Page.IsPostBack Then
ddl.Items.Add(New ListItem("12", "13"))
ddl.Items.Add(New ListItem("14", "15"))
End If
pnlDynamic.Controls.Add(ddl)
Dim txtBx As New TextBox
txtBx.ID = "txtPage" & i
If Not Page.IsPostBack Then
txtBx.Text = "Preset"
End If
pnlDynamic.Controls.Add(txtBx)
Next
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server" >
<div>
<br />
<br />
<a href="Default.aspx">Get-Request</a>
<br />
<br />
<asp:Panel runat="server" ID="pnlDynamic" />
<br />
<br />
<asp:DropDownList runat="server" ID="ddlFixed" />
<asp:Button runat="server" ID="btn" Text="Postback"/>
</div>
</form>
</body>
</html>