【问题标题】:Dynamically recreated TextBox Value in Page_PreInit dependent on value of HiddenFieldPage_PreInit 中动态重新创建的 TextBox 值取决于 HiddenField 的值
【发布时间】:2018-04-23 06:11:31
【问题描述】:

我创建了一些动态控件,例如:TextBox。 这些是在ModalPopupExtender 中创建的,并且是在 ButtonClick 之后创建的。

protected void AddGroupBTN_Click(object sender, EventArgs e)
{
   GroupMPE.Show();//GroupMPE is a ModalPopupExtender 
   ScheduleIdHF.Value = 1; //ScheduleIdHF is a HiddenField declared in the .aspx page
   CreateControls(ScheduleIdHF.Value);
   ...
}
private void CreateControls(string ScheduleId)
{
    TableRow TR = new TableRow();
    TR.ID = "tableRow1";
    TableCell TC = new TableCell();
    TC.ID = "tableCell1;
    TextBox textBox = new TextBox();
    textBox.ID = "textBox1";
    TC.Controls.Add(textBox);
    TR.Cells.Add(TC);
    ExampleTable1.Rows.Add(TR);//ExampleTable1 is declared in the .aspx page

}

然后,当单击另一个按钮时,我想像这样在Page_PreInit 上重新创建这些控件。

protected void Page_PreInit(object sender, EventArgs e)
{
    if(IsPostBack)
        {
            if (!string.IsNullOrEmpty(ScheduleIdHF.Value))
            {
                CreateControls(ScheduleIdHF.Value);
                ...

但是,我希望对 CreateControls 的方法调用以HiddenField ScheduleIdHF 的值为条件并使用它。问题是 HiddenField 为 null 并且不是在 Page_PreInit 事件之后创建的。有没有人有任何解决方案来解决这个难题?因为我想在回发后得到TextBox的文字。

【问题讨论】:

标签: c# asp.net dynamic textbox


【解决方案1】:

使用 Session 变量存储 HiddenField 的值,然后在 PreInit 事件中检索它,如:

        protected void Page_PreInit(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string ScheduleIdHF = string.Empty;
            if (Session["ScheduleIdHF"] != null)
            {
                ScheduleIdHF = Session["ScheduleIdHF"].ToString();
                CreateControls(ScheduleIdHF);
                ...
            }
        }
    }

【讨论】:

  • 我给了你一个赞成票并接受了你的回答,因为它是一个很好的回答。
【解决方案2】:

您可以使用以下代码轻松访问文本框/隐藏字段值。这只是使用基本的网络编程思想,任何发布到服务器的东西都可以在Request 对象中使用。

在 PreInit 事件中访问控制值的代码隐藏

protected void Page_PreInit(object sender, EventArgs e)
{
    if(Page.IsPostBack) {
       var x = Request[TextBox1.UniqueID];
       var y = Request[ScheduleIdHF.UniqueID];
       //use values of x and/or y to implement your logic
       if(y != null && y == "somevalue") {
          //your custom logic goes here
       }
   }
}

文本框标记

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:HiddenField ID="ScheduleIdHF" runat="server"  Value="1010"/>

【讨论】:

  • 我给了你一个赞成票,但我接受了@Ernesto Rodriguez Lucas 的回答,因为它更适合我的需要。不过你的回答很好。
  • 没问题。请记住,如果隐藏字段值在客户端由 JavaScript 更改,则 Session 变量方法将不起作用。因此,在我看来,这不是一个好的解决方案,因为它并不总是有效。此外,会话变量在每个用户的基础上消耗额外的内存,这对 ASP.Net 应用程序不利;您应该始终尽量减少应用程序中的内存消耗。另一方面,请求变量方法不会在每个用户基础上消耗任何额外的内存,并且即使隐藏字段值被 JavaScript 更改也始终有效。
  • 另外,如果您必须使用 Session 变量方法,请确保在 Page_PreRender 事件中设置 Session 变量,该事件在页面生命周期结束时触发,否则您可能会遇到难以调试的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2013-05-13
相关资源
最近更新 更多