4

要问我的问题,我创建了一个aspx包含 aButton和 aDataListSqlDataSource的文件:

    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

    <asp:DataList ID="DataList1" runat="server" DataKeyField="a" 
    DataSourceID="SqlDataSource1" >
        <ItemTemplate>
            a:
            <asp:Label ID="aLabel" runat="server" Text='<%# Eval("a") %>' />
            <br />
            b:
            <asp:Label ID="bLabel" runat="server" Text='<%# Eval("b") %>' />
            <br />
        </ItemTemplate>
    </asp:DataList>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:probaConnectionString %>" 
    SelectCommand="SELECT [a], [b] FROM [PROBA_TABLE]"></asp:SqlDataSource>

在我后面的代码中,我添加TextBoxes了 DataList 的 Items。我在 Page_Load 中为每个 Item 添加一个 TextBox,并在 Button Clickeventhandler中添加另一个 TextBox。

    public partial class _Default : System.Web.UI.Page
    {   
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                foreach (DataListItem item in DataList1.Items)
                {
                    item.Controls.Add(new TextBox());
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            foreach (DataListItem item in DataList1.Items)
            {
                item.Controls.Add(new TextBox());
            }
        }

    }
}

除了一件事,这很好用。当我单击 Button 时,在 Page_Load 中创建的 TextBoxes 保留它们的 Text 值,但在它们中创建的 TextBoxesButton1_Click会丢失它们的 Text 值。我真正的问题比这更复杂,但我认为解决这个问题会对我有很大帮助。

回发后我的网站

4

2 回答 2

3

每个应该从页面 ViewState 接收数据的控件都应该在InitLoad事件处理程序中实例化,因为 ViewState 被持久化到控件BEFORE Click、Change和其余控件事件(当检测到 ViewState 更改时触发这些事件,因此必须读取 ViewState在触发Click事件之前)。

所以这个过程应该是这样的:

  1. OnInit(创建静态控件)
  2. 静态控件内容从 ViewState 反序列化
  3. OnLoad(创建动态控件,在您的情况下是您在上次回发中创建的文本框)
  4. 动态控件内容从 ViewState 反序列化
  5. 根据比较 POST 数据和 ViewState 数据检测到的更改触发Click、Change和其他事件

建议:

您可以使用隐藏字段来保存其他状态信息,然后在 OnLoad 中您可以读取该信息以重新创建动态创建的控件。

此外,您应该明确设置文本框的 ID 属性,以便可以正确保留值,不要依赖 ASP.Net。

于 2013-01-27T10:20:31.547 回答
0

默认情况下,http 是无状态的,这意味着在处理您的请求后,服务器不保留请求的数据或信息,
但是在出现错误的特殊情况下,表单中的值需要保留,

假设您填写了一个长表单,然后将其发布回服务器只是为了得到一条错误消息并且所有填充的值都消失了。这不会很烦人

,所以 asp.net 在幕后做了什么,它在页面中隐藏了一个字符串,其中包含有关所有服务器控件及其 id 的信息,
因此当您发回表单时,Page class创建的值和值是回发并绑定在特定控件中
,因为Page class在每个请求中都会创建pageLoad事件运行,然后在 PageLoad 中创建的控件呈现与它们的 id 对应的值被放入其中,这
与在按钮单击时创建的控件不同,
直到button_click事件运行,视图状态已经被反序列化并且值被填充到其中

于 2013-01-27T10:31:58.313 回答