Asp.Net?
親マスターページの定義
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Parent.master.cs" Inherits="Test.Parent" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<img alt="" class="style1" src="Images/logo.gif" /></div>
<asp:ContentPlaceHolder ID="ContentPlaceHolderHeader" runat="server">
</asp:ContentPlaceHolder>
</form>
</body>
</html>
子マスターページの定義
<%@ Master Language="C#" MasterPageFile="~/Parent.Master" AutoEventWireup="true" CodeBehind="Child.master.cs" Inherits="Test.Child" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolderHeader" runat="server">
<table style="width: 100%;">
<tr>
<td class="style78" valign="top">
<asp:Panel ID="Panel1" runat="server">
<asp:Label ID="Label1" Text="ABC" runat="server" />
</asp:Panel>
</td>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</td>
</tr>
</table>
</asp:Content>
一般のフォームページの作成
<%@ Page Title="" Language="C#" MasterPageFile="~/Child.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Test.WebForm1" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <p>XXXX</p> </asp:Content>
マスターページの使用がないページに対して、「this」は自分自身に指し、FindControlでもちろんページのコントロールを取得できるはずですが、マスターページをマークすると、「this.Control」でウォッチしてみると、ページ内のコントロールの順番階層がすべて変わって、マスターページから順番に並んで行く形となる。なので、マスターページ内のコントロールを検索するために、最初にマスターページ内の「ContentPlaceHolder」コントロールを取得してから、階層的に中のコントロールを取得して行きます。同様に入れ子マスターページ使用する場合、最初に一番上のマスターページ内の「ContentPlaceHolder」コントロールを取得し、次は二番目のマスターページの「ContentPlaceHolder」コントロールを取得して、こういう順番で取得したいコントロールを取得できる。
下記のソースコードは、入れ子マスターページが二つがある場合、子マスターページ内のコントロールを取得する例:
//親マスターページのインスタンスから、子マスターページ内の「ContentPlaceHolder」コントロールを取得
ContentPlaceHolder mpContentPlaceHolder = Page.Master.Master.FindControl("ContentPlaceHolderHeader") as ContentPlaceHolder;
if (mpContentPlaceHolder != null)
{
//取得した子マスターページの「ContentPlaceHolder」コントロールから、
//子マスターページ内に配置した「Panel1」コントロールを取得する
Panel mpTextBox = mpContentPlaceHolder.FindControl("Panel1") as Panel;
if (mpTextBox != null)
{
mpTextBox.Visible = false;
}
}