加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 为什么我的动态添加控件会在Postback后松散它们的值

发布时间:2020-12-16 09:52:45 所属栏目:asp.Net 来源:网络整理
导读:要问我的问题,我创建了一个包含Button和带有SqlDataSource的DataList的aspx文件: asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" / asp:DataList ID="DataList1" runat="server" DataKeyField="a" DataSourceID="SqlDataSo
要问我的问题,我创建了一个包含Button和带有SqlDataSource的DataList的aspx文件:

<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 Click事件处理程序中添加了另一个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中创建的TextBox会保留其Text值,但在Button1_Click中创建的TextBox会丢失其Text值.我真正的问题比这更复杂,但我认为解决这个问题会对我有所帮助.

解决方法

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

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

> OnInit(创建静态控件)
>从ViewState反序列化静态控件内容
> OnLoad(创建动态控件,在您的案例中,您在上一个Postback中创建的文本框)
>动态控件内容从ViewState反序列化
>根据检测到的比较POST数据和ViewState数据的更改,触发Click,Change和其他事件

建议:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读