Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Aspx获取动态添加的文本框的值_C#_Asp.net - Fatal编程技术网

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

C# Aspx获取动态添加的文本框的值,c#,asp.net,C#,Asp.net,我在aspx页面上动态添加了两个文本框 我希望在回发后(单击Btn1后)从服务器端的这两个文本框中获取值 这是我的第一个问题——找不到控件。 我试图找到具有以下功能的控件: Page.FindControl("txt4"); 这有什么问题?整个页面不是都贴回来了吗 我的另一个问题是-在代码中的哪里可以获得这些值?在页面加载事件中,在重新添加之前?我猜当触发Btn1_Click事件时,这两个控件已经被重新添加,所以原始回发的值丢失了?(页面加载事件在Btn1单击之前触发) 我真的很挣扎 如果控件

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

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

这是我的第一个问题——找不到控件。 我试图找到具有以下功能的控件:

Page.FindControl("txt4");
这有什么问题?整个页面不是都贴回来了吗

我的另一个问题是-在代码中的哪里可以获得这些值?在页面加载事件中,在重新添加之前?我猜当触发Btn1_Click事件时,这两个控件已经被重新添加,所以原始回发的值丢失了?(页面加载事件在Btn1单击之前触发)

我真的很挣扎

如果控件是通过标记添加的,那就容易多了——它们可以通过它们的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>
我已经检查了调试器中的代码-在回发时添加了控件,但是st1、st2、txt4_dynamic和txt5_dynamic的值仍然为空/null

更新2:

有两个问题:

  • 查找控制应通过以下方式完成:
  • 上面的代码仅在控件事件中查找控件文本(它们在页面加载后被触发
    所以:一切都可以保持我最初发布的状态-唯一需要的更改是查找控件的代码,它必须在
    单击
    事件中。如果相同的代码在
    Page\u Load
    事件中,它将不起作用。

    请将代码更改为如下(基本上将动态控件创建/添加移动到
    Page\u Init
    ):

    每次回发时都会在服务器端创建控件树。由于控件是动态添加的,所以需要在每次回发时添加它们,而您已经在这样做了

    将该代码移动到
    Page\u Init
    事件的原因是,从客户端发布的值在
    LoadPostData
    事件中设置,该事件发生在
    Page\u Init
    之后和
    Page\u Load
    之前 当您在
    Page_Init
    中有代码时,到
    LoadPostData
    事件发生时,已创建控制树并正确设置了发布值。

    当代码位于
    页面加载中时,
    加载PostData
    事件甚至在创建控件和未设置过账值之前就发生了。

    请将代码更改为如下所示(基本上将动态控件创建/添加移动到
    页面初始
    ):

    每次回发时都会在服务器端创建控件树。由于控件是动态添加的,所以需要在每次回发时添加它们,而您已经在这样做了

    将该代码移动到
    Page\u Init
    事件的原因是,从客户端发布的值在
    LoadPostData
    事件中设置,该事件发生在
    Page\u Init
    之后和
    Page\u Load
    之前 当您在
    Page_Init
    中有代码时,到
    LoadPostData
    事件发生时,已创建控制树并正确设置了发布值。

    当您在
    Page\u Load
    中有代码时,
    LoadPostData
    事件甚至在创建控件和未设置发布值之前就发生了。

    如果答案对您有效,请接受它,以便其他人清楚。@Boney-我已更新了问题。我的意思是将该代码单独移动到Page\u Init。不是完整的代码。无论如何,我现在已经用完整的代码更新了答案。如果答案对你有效,请接受它,以便其他人清楚。@Boney-我已经更新了问题。我想把那段代码单独移动到Page_Init。不是完整的代码。无论如何,我现在已经用完整的代码更新了答案。这个例子对你有用吗?如果您在两个文本框中都插入了一些文本,您是否在单击按钮后在服务器端看到这些文本?我没有看到那个文本,在页面加载/btn1\u点击事件中也没有找到这两个文本框。是的,我上面发布的代码可以正常工作。您使用的是完全相同的代码还是有一些修改?不,我没有任何修改。我使用的是从VS2015-Projects-Web应用程序-ASP.NET Web表单创建的默认项目。里面的“about”是我的代码。好吧,我明白了为什么它不适合你。我没有使用母版页,因此“Page.FindControl(“txt4”);”为我而不是你工作。让我看看如何更改该行以使其适合您。好的。我现在已经更新了代码。现在应该对你有用了。您可能可以添加一些空检查/索引检查和/或找到从页面对象查找控件的更好方法<代码>FindControl
    方法不是递归的。所以你必须找到一个接一个的控件。这个例子对你有用吗?如果您在两个文本框中都插入了一些文本,您是否在单击按钮后在服务器端看到这些文本?我没有看到那个文本,在页面加载/btn1\u点击事件中也没有找到这两个文本框。是的,我上面发布的代码可以正常工作。您使用的是完全相同的代码还是有一些修改?不,我没有任何修改。我使用的是从VS2015-Projects-Web应用程序-ASP.NET Web表单创建的默认项目。里面的“about”是我的代码。好吧,我明白了为什么它不适合你。我没有使用母版页,因此“Page.FindControl(“txt4”);”为我而不是你工作。让我看看如何更改该行以使其适合您。好的。我现在已经更新了代码。现在应该对你有用了。您可能可以添加一些空检查/索引检查和/或找到从页面对象查找控件的更好方法<代码>FindControl方法不是递归的。所以你必须找到一个接一个的控制。
       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;
        }
      }
    }
    
    Page.Controls[0].FindControl("MainContent").FindControl("txt4");
    
    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;
            }
        }
    }