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