Aspx获取动态添加文本框的值

时间:2017-05-13 05:47:58

标签: c# asp.net

我已经在aspx页面上动态添加了两个文本框。

我希望在回发后(在单击Btn1之后)从服务器端的这两个文本框中获取值。

这是我的第一个问题 - 找不到控件。 我试图找到控件:

Page.FindControl("txt4");

这有什么问题?是不是整个页面都贴回了所有控件?

我的另一个问题是 - 在代码中获取这些值的位置?在Page_load事件中,在重新添加它们之前?我想当触发Btn1_Click事件时,这两个控件已经重新添加,所以原始回发的值会丢失吗? (在Btn1_Click之前触发Page_load事件。)

我真的很挣扎。

如果通过标记添加控件会更容易 - 它们可以直接在他们的ID后面的代码中访问。但是在我目前工作的项目中,控件大多是动态添加的,而且很多都是。

代码背后:

  public partial class About : Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      btn1.Click += Btn1_Click;

      if(IsPostBack)
     {
        System.Web.UI.Control txt4_dynamic = Page.FindControl("txt4");
        System.Web.UI.Control txt5_dynamic = Page.FindControl("txt5");

        if(txt4_dynamic != null)
        {
            string str1 = ((TextBox)txt4_dynamic).Text;          
        }

        if (txt5_dynamic != null)
        {
            string str1 = ((TextBox)txt5_dynamic).Text;
        }
     }

      TextBox txt4 = new TextBox();
      txt4.ClientIDMode = ClientIDMode.Static;
      txt4.ID = "txt4";     

      TextBox txt5 = new TextBox();
      txt5.ClientIDMode = ClientIDMode.Static;
      txt5.ID = "txt5";

      panel1.Controls.Add(txt4);
      panel1.Controls.Add(txt5);


    }

    private void Btn1_Click(object sender, EventArgs e)
    {      
      System.Web.UI.Control txt4_dynamic = Page.FindControl("txt4");
      System.Web.UI.Control txt5_dynamic = Page.FindControl("txt5");

      if (txt4_dynamic != null)
      {
          string str1 = ((TextBox)txt4_dynamic).Text;
      }

      if (txt5_dynamic != null)
      {
          string str1 = ((TextBox)txt5_dynamic).Text;
      }
    }
  }

标记:

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

  <asp:Button ID="btn1" runat="server" Text="Button" />

  <asp:Panel ID="panel1" runat="server" ClientIDMode="Static">    
  </asp:Panel>

</asp:Content>

更新

我用以下代码更新了我的代码:

   protected void Page_Init(object sender, EventArgs e)
{
  if(IsPostBack)
  {
    TextBox txt4 = new TextBox();
    txt4.ClientIDMode = ClientIDMode.Static;
    txt4.ID = "txt4";

    TextBox txt5 = new TextBox();
    txt5.ClientIDMode = ClientIDMode.Static;
    txt5.ID = "txt5";

    panel1.Controls.Add(txt4);
    panel1.Controls.Add(txt5);

    string st1 = txt4.Text;
    string st2 = txt5.Text;


    System.Web.UI.Control txt4_dynamic = Page.FindControl("txt4");
    System.Web.UI.Control txt5_dynamic = Page.FindControl("txt5");

    if (txt4_dynamic != null)
    {
      string str1 = ((TextBox)txt4_dynamic).Text;
    }

    if (txt5_dynamic != null)
    {
      string str1 = ((TextBox)txt5_dynamic).Text;
    }
  }
}

我已经检查了调试器中的代码 - 在回发时添加了控件,但st1,st2,txt4_dynamic和txt5_dynamic的值仍为空/ null。

更新2:

有两个问题:

  1. 应该通过以下方式完成控制:
  2. Page.Controls[0].FindControl("MainContent").FindControl("txt4");
    
    1. 上面的代码仅在控件事件中找到控件文本(并且在Page_Load之后触发它们)。
    2. 所以:一切都可以像我最初发布的那样保持 - 唯一需要的变化是找到控制的代码,它必须在click事件中。如果同一代码在Page_Load事件中,则无效。

1 个答案:

答案 0 :(得分:2)

请将代码更改为如下(基本上将动态控件创建/添加移至Page_Init):

public partial class About : Page
{
    protected void Page_Init(object sender, EventArgs e)
    {
        TextBox txt4 = new TextBox();
        txt4.ClientIDMode = ClientIDMode.Static;
        txt4.ID = "txt4";

        TextBox txt5 = new TextBox();
        txt5.ClientIDMode = ClientIDMode.Static;
        txt5.ID = "txt5";

        panel1.Controls.Add(txt4);
        panel1.Controls.Add(txt5);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        btn1.Click += Btn1_Click;

        if (IsPostBack)
        {
            System.Web.UI.Control txt4_dynamic = Page.Controls[0].FindControl("MainContent").FindControl("txt4");
            System.Web.UI.Control txt5_dynamic = Page.Controls[0].FindControl("MainContent").FindControl("txt5");

            if (txt4_dynamic != null)
            {
                string str1 = ((TextBox)txt4_dynamic).Text;
            }

            if (txt5_dynamic != null)
            {
                string str1 = ((TextBox)txt5_dynamic).Text;
            }
        }
    }

    private void Btn1_Click(object sender, EventArgs e)
    {
        System.Web.UI.Control txt4_dynamic = Page.Controls[0].FindControl("MainContent").FindControl("txt4");
        System.Web.UI.Control txt5_dynamic = Page.Controls[0].FindControl("MainContent").FindControl("txt5");

        if (txt4_dynamic != null)
        {
            string str1 = ((TextBox)txt4_dynamic).Text;
        }

        if (txt5_dynamic != null)
        {
            string str1 = ((TextBox)txt5_dynamic).Text;
        }
    }
}

在每个回发的服务器端创建控制树。由于控件是动态添加的,因此需要在每个回发中添加,您已经在做了。

将代码移至Page_Init事件的原因是,从客户端发布的值在LoadPostData事件中设置,该事件发生在Page_Init之后和Page_Load之前。
当您拥有Page_Init中的代码时,在LoadPostData事件发生时,控制树已经创建,并且已正确设置过帐值。
如果您使用Page_Load中的代码,则LoadPostData事件甚至在创建控件之前就已发生,并且未设置发布值。