代码之家  ›  专栏  ›  技术社区  ›  schudel

动态创建的DropDownList在回发时丢失ListItem

  •  7
  • schudel  · 技术社区  · 16 年前

    我有一个页面,其中包含一些动态创建的控件(文本框和DropDownList)。当发生回发时,文本框保留其值,但DropDownList会丢失其列表项。 这非常令人困惑,因为页面级别的DropDownList也保留其列表项。有人能看看下面的代码有什么问题吗?

    如能为解决这一问题提供帮助,我们将不胜感激。

    <%@ 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>
    
    5 回复  |  直到 16 年前
        1
  •  6
  •   schudel    16 年前

    我找到了一个解决方案,可以让我在回发时保持视图状态。 调用itemCollection的trackViewState。

    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>
    
        2
  •  0
  •   andleer    16 年前

    启用视图状态时,DDL将维护其项和选择。文本框将维护其内容,而不管视图状态如何,因为生成的HTML将在回发时写回服务器。

    我发现在代码和标记中包含所有这些viewstate语句是很勇敢的。

    有几件事正在发生:

    1. 控件的视图状态被禁用
    2. 控制层次结构上方的视图状态被禁用(页、窗体、面板)
    3. 在页面循环中动态添加控件的时间太晚,无法从视图状态加载所选内容。在init中加载应该可以。
        3
  •  0
  •   Romias    16 年前

    可能需要显式激活这些DropDownList的视图状态…

    编辑:这就是我最后一句话的意思…

        <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>
    
        4
  •  -1
  •   Ian G    16 年前

    我总是使用 Page_Load 从来没有这样的麻烦。也许你可以看看。

    我通常将数据绑定到第一次加载页面时的控件,然后让viewstate处理回发等。请注意,它们建议您在 页负荷

    退房 http://support.microsoft.com/kb/305141

    页面事件 loadtocnode(2,“更多信息”); 在ASP.NET页的生命周期中,一些标准事件 暴露在 对象经常使用。ASP.NET页框架 运行时自动连接(或连接)适当的委托实例 这些方法的时间到了。这样就不用写必要的“胶水”。 下面的列表显示了在 按点火顺序运行时间:
    • 帕吉尔尼特 :在此事件期间,可以初始化值或连接 您可能拥有的事件处理程序。
    • 页负荷 :在此事件期间,您可以执行一系列操作 第一次创建ASP.NET页或响应客户端事件 这是一个帖子的结果。页面和控件视图状态已还原 在此事件之前。使用 背靠背 page属性检查这是否是第一次 正在处理页。如果是第一次,请执行数据绑定。也, 读取和更新控件属性。
    • 页面数据库 : 数据绑定 数据绑定 方法是在页级别调用的。如果你打电话 数据绑定 在单个控件上,它只激发 数据绑定 它下面的控件的事件。
    • 页预处理机 : 预置器 事件在保存视图状态和 控件被呈现。您可以使用此事件在最后一分钟执行 操作您的控件。
    • 页卸载 :页面渲染完成后, 页卸载 事件火灾。此事件是执行最终清理的好地方 工作。这包括清理打开的数据库连接, 丢弃对象,或关闭打开的文件。
    以下列表概述了 非确定性:
    • 页错误 :如果在页处理过程中发生未处理的异常,则 误差 事件火灾。这个 误差 活动让您有机会优雅地处理 错误。
    • 页码:AbortTransaction : 交易 如果要指示事务是否 成功或失败。此事件通常用于中的购物车方案 此事件可以指示订单的成功或失败。这一事件 在事务中止时激发。
    • 页面提交事务 :提交事务时激发此事件 成功地。
        5
  •  -1
  •   Tor Haugen    16 年前

    DropDownList中的列表项不存储在视图状态中。你必须在每个回邮中添加它们。

    存储在视图状态中的是所选索引,即控件的“值”。

    编辑: 嗯,看来我今天学到了一些东西。我承认错误:—)