Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 动态创建的DropDownList在回发时丢失ListItems_Asp.net_Vb.net_Drop Down Menu_Viewstate - Fatal编程技术网

Asp.net 动态创建的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

我有一个页面,其中包含一些动态创建的控件(TextBox和DropDownList)。发生回发时,文本框保留其值,但DropDownList丢失其列表项。 这是相当混乱的,因为页面级别的DropDownList也保留了它的ListItems。有人能看到下面的代码有什么问题吗

如果您能帮助解决这个问题,我们将不胜感激

<%@ 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已禁用
  • 控件层次结构上方的视图状态已禁用(页面、窗体、面板)
  • 您在页面周期中动态添加控件的时间太晚,无法从viewstate加载所选内容。在INIT中加载应该可以

  • 我总是使用
    页面加载
    ,从来没有遇到过这样的问题。也许你可以看看

    我通常在第一次加载页面时将数据绑定到控件,然后让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>