您的位置:首页 > 其它

【转】当PreviousPage.FindControl遇到MasterPage,如何查找控件

2008-07-23 17:23 435 查看
本文转自:http://www.sqlsky.com/asp-net/070721/585/

有以下两个页面Default.aspx和Result.aspx,代码如下:

<!-- Default.aspx -->

<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Default.master" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">

<asp:Label ID="Label1" runat="server" Text="Please input a string here"></asp:Label>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/Result.aspx" /></asp:Content>

//Default.aspx.cs

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

//using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

}

<!-- Result.aspx -->

<%@ Page Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true" CodeFile="Result.aspx.cs" Inherits="Result" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<asp:Label ID="Label1" runat="server" Text="The string you input in the previous page is"></asp:Label>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

</asp:Content>

//Result.aspx.cs

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class Result : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (PreviousPage != null)

{

TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");

if (tb != null)

TextBox1.Text = tb.Text;

}

}

}

这两个页面都指定了MasterPageFile属性。因为该MasterPage中的内容无关紧要,就不列出来了。在Default.aspx上有两个控件:TextBox1用于接受用户的输入,Button1用于提交页面,其PostBackUrl指向Result.aspx。在Result.aspx.cs的Page_Load方法中尝试在TextBox1中显示用户在前一页面的TextBox1中输入的字符串。当执行以下语句时:

TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1");

tb的值为null。将以上语句更改为如下代码:

Content con = (Content)PreviousPage.FindControl("Content1");

if (con == null)

return;

TextBox tb = (TextBox)con.FindControl("TextBox1");

但con的值为null,这样后续的语句也不可能执行了。问题出在哪里呢?

经过一番搜索,在forums.asp.net中找到了答案,以下引用的是bitmask的说法:

...becasue the Content controls themselves dissapear after the master page rearranges the page. You can use the ContentPlaceHolders, or the <form> on the MasterPage if there are no INamingContainers between the form and the control you need.

所以以上的代码应该改成:

TextBox tb = (TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");

bitmask还在他的博客上写了一篇文章来阐述FindControl方法和INamingContainers接口:

http://www.odetocode.com/Articles/116.aspx

在他的另一篇文章里给出了一张图片,显示出了运行时母版页与内容页合并后的页面上各个控件的关系,我冒昧地贴在这里了:



原文:http://odetocode.com/Blogs/scott/archive/2006/01/12/2726.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: