在母版页中我有一个asp:TextBox,其id为“txtMasterTextBox”。我想在子页面中更改此文本框的“文本”属性,此页面中另一个带有“childTextBox”文本的文本框已更改。 在childTextBox_TextChanged()我有
TextBox tbTest = (TextBox)this.Master.FindControl("txtMasterTextBox");
tbTest.Text = childTextBox.Text;
我可以通过Text Visualiser看到lbTest.Text已成功更改,但在主页面上的实际textBox中没有任何变化。发生了什么事?
答案 0 :(得分:2)
您必须在主服务器中提供公共属性作为TextBox
的访问者。然后你只需要相应地转换页面的Master
属性。
在你的主人:
public TextBox MasterTextBox {
get {
return txtMasterTextBox;
}
}
在您的子页面中(假设您的主人的类型为MyMaster
):
((MyMaster) this.Master).MasterTextBox.Text = childTextBox.Text;
但是,这只是一种比FindControl
方法更简洁的方法,所以我不确定为什么TextBox
不会显示您更改的文字。也许这是关于回发的DataBind
问题。
更好的方法是不在属性中公开控件,而只是在Text
。然后,您可以轻松更改基础类型。考虑您希望稍后将类型从TextBox
更改为Label
。您必须使用FindControl
更改所有内容页面,您甚至不会收到编译器警告但会收到运行时异常。使用proeprty方法,您需要编译时间检查。如果您甚至将其更改为仅获取/设置基础控件的Text
的属性,则可以在不更改任何内容页面的情况下对其进行更改。
例如:
public String MasterTextBoxText {
get {
return txtMasterTextBox.Text;
}
set {
txtMasterTextBox.Text = value;
}
}
并在内容页面中:
((MyMaster) this.Master).MasterTextBoxText = childTextBox.Text;
答案 1 :(得分:2)
you have to do this
In master page.
Master: <asp:TextBox ID="txtMasterTextBox" runat="server"></asp:TextBox>
In Child Page.
child: <asp:TextBox ID="childtxt" runat="server" ontextchanged="childtxt_TextChanged" **AutoPostBack="true"**></asp:TextBox>
than in Textchange event of child textbox
protected void childtxt_TextChanged(object sender, EventArgs e)
{
TextBox tbTest = (TextBox)this.Master.FindControl("txtMasterTextBox");
tbTest.Text = childtxt.Text;
}
**so basiclly u have to put one attribute "AutoPostback" to True**