7

我有一个页面,其中包含一些动态创建的控件(TextBox 和 DropDownList)。当回发发生时,TextBox 会保留它们的值,但 DropDownList 会丢失它们的 ListItem。这很令人困惑,因为页面级别的 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>
4

5 回答 5

6

我找到了允许我在回发中保持视图状态的解决方案。就是调用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>
于 2009-03-08T16:32:03.393 回答
0

可能您需要为那些 DropDownLists 显式激活 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>
于 2009-03-08T14:15:58.227 回答
0

当启用视图状态时,DDL 将保持其项目和选择。无论视图状态如何,文本框都将保持其内容,因为生成的 html 在回发时被写回服务器。

我觉得你的代码和标记中有所有这些视图状态语句很有趣。

发生了几件事之一:

  1. 控件的 ViewState 被禁用
  2. 控件层次结构上方的 ViewState 被禁用(页面、表单、面板)
  3. 您在页面周期中动态添加控件为时已晚,无法从视图状态加载选择。加载 INIT 应该没问题。
于 2009-03-08T14:21:02.647 回答
-1

DropDownList 中的列表项不存储在视图状态中。您必须在每次回发时添加它们。

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

编辑:嗯,看来我今天学到了一些东西。我纠正了:-)

于 2009-03-08T14:05:43.073 回答
-1

我一直在使用Page_Load,从来没有遇到过这样的麻烦。也许你可以看看。

我通常在页面第一次加载时将数据绑定到控件,然后让 Viewstate 处理回发等。请注意,他们建议您在Page_Load...期间绑定数据

查看http://support.microsoft.com/kb/305141

页面事件 loadTOCNode(2, 'moreinformation'); 在 ASP.NET 页的生命周期中,经常使用从Page对象公开的一些标准事件。ASP.NET 页面框架在运行时为这些方法自动连接(或连接)适当的委托实例。这使您不必编写必要的“粘合代码”。以下列表显示了在运行时按触发顺序连接的委托实例:
  • Page_Init:在此事件期间,您可以初始化值或连接您可能拥有的任何事件处理程序。
  • Page_Load:在此事件期间,您可以执行一系列操作来首次创建 ASP.NET 页面或响应帖子产生的客户端事件。在此事件之前已恢复页面和控件视图状态。使用IsPostBack页面属性检查这是否是第一次处理页面。如果是第一次,请执行数据绑定。此外,读取和更新控件属性。
  • Page_DataBind:在页面级别调用DataBind方法时引发DataBind事件。如果在单个控件上调用DataBind,它只会触发其下方控件的DataBind事件。
  • Page_PreRenderPreRender事件在保存视图状态和呈现控件之前触发。您可以使用此事件对控件执行任何最后一分钟的操作。
  • Page_Unload:页面完成渲染后,Page_Unload事件触发。此事件是执行最终清理工作的好地方。这包括清理打开的数据库连接、丢弃对象或关闭那些打开的文件等项目。
以下列表概述了不确定的事件:
  • Page_Error:如果在页面处理期间发生未处理的异常,则会触发Error事件。Error事件使您有机会优雅地处理错误。
  • Page_AbortTransaction:如果您想指示事务是成功还是失败,事务事件很有用。该事件通常用于购物车场景,该事件可以指示订单成功或失败。当事务被中止时触发此事件。
  • Page_CommitTransaction:当事务成功提交时触发此事件。
于 2009-03-08T14:26:26.283 回答