我已经在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:
有两个问题:
Page.Controls[0].FindControl("MainContent").FindControl("txt4");
Page_Load
之后触发它们)。 所以:一切都可以像我最初发布的那样保持 - 唯一需要的变化是找到控制的代码,它必须在click
事件中。如果同一代码在Page_Load
事件中,则无效。
答案 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
事件甚至在创建控件之前就已发生,并且未设置发布值。