主页面控制访问c#

时间:2013-02-01 08:54:13

标签: c# asp.net controls master-pages

在母版页中我有一个asp:TextBox,其id为“txtMasterTextBox”。我想在子页面中更改此文本框的“文本”属性,此页面中另一个带有“childTextBox”文本的文本框已更改。 在childTextBox_TextChanged()我有

TextBox tbTest = (TextBox)this.Master.FindControl("txtMasterTextBox");
tbTest.Text = childTextBox.Text;

我可以通过Text Visualiser看到lbTest.Text已成功更改,但在主页面上的实际textBox中没有任何变化。发生了什么事?

2 个答案:

答案 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**