这就出现了母版页嵌套子母版页的状况,那么继承自子母版页的内容页需要与其通信的问题就接踵而至。
举例说明:前提母版页MasterPage.master,子母版页ChildPage.master,含有一GridView控件,继承自MasterPage.master的内容页Index.aspx,继承自ChildPage.master的内容页ContentPage.aspx。
目标:内容页ContentPage.aspx调用ChildPage.master的GridView控件并初始化(内容页与嵌套母版页的通信)。
1、母版页MasterPage.master代码:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MainMasterPage.master.cs" Inherits="MainMasterPage" %>
- <!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 id="Head1" runat="server">
- <title></title>
- </head>
- <body leftmargin="0" topmargin="0">
- <form id="form1" runat="server">
- <div align="center">
- <table width="763" height="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
- <tr>
- <td width="763" valign="top">
- <asp:ContentPlaceHolder ID="ContentPlaceHolderMain" runat="server">
- </asp:ContentPlaceHolder>
- </td>
- </tr>
- </table>
- </div>
- </form>
- </body>
- </html>
2、子母版页ChildPage.master(继承自MasterPage.master)页面代码:
- <asp:Content ContentPlaceHolderID="ContentPlaceHolderMain" runat="server">
- <table width="910" border="0" cellpadding="0" cellspacing="0" align="center">
- <tr>
- <td style="width: 910px">
- <table width="899" height="374" border="0" align="center" cellpadding="0" cellspacing="0">
- <tr>
- <td valign="top" style="width: 246px">
- <table width="215" border="0" cellpadding="0" cellspacing="0" style="height: 26px"
- id="TABLE1">
- <tr>
- <td>
- <div style="text-align: center; margin-left: 30px;" mce_style="text-align: center; margin-left: 30px;">
- <asp:GridView ID="gv_ChildMenu" runat="server" AutoGenerateColumns="False" Width="100%"
- GridLines="None" OnRowDataBound="gv_ChildMenu_RowDataBound">
- <Columns>
- <asp:TemplateField SortExpression="Newtitle">
- <ItemTemplate>
- <asp:LinkButton runat="server" ID="linkBtn_Nav" Text='<%# Eval("ChildMenuName") %>' OnClick="linkBtn_Nav_Click"
- Font-Size="10pt" Font-Bold="true" ForeColor=" #3e3f41"></asp:LinkButton>
- </ItemTemplate>
- <ItemStyle VerticalAlign="top" HorizontalAlign="left" CssClass="gvBorder" />
- </asp:TemplateField>
- </Columns>
- <RowStyle HorizontalAlign="Center" Height="30px" Width="30px" VerticalAlign="middle"
- Font-Underline="false" />
- <HeaderStyle Height="0px" />
- </asp:GridView>
- </div>
- </td>
- </tr>
- </table>
- </td>
- <td colspan="2" valign="top">
- <p>
- <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
- </asp:ContentPlaceHolder>
- </p>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </asp:Content>
第一句代码<%@ Master Language="C#" AutoEventWireup="true" CodeFile="ChildPage.master.cs" Inherits="ChildPage" MasterPageFile="~/MasterPage.master" %>
就是对母版页MasterPage.master的继承(即嵌套到母版页MasterPage.master中)
该页中有一个GridView控件,ID为"gv_ChildMenu"
3、继承自子母版页ChildPage.master的内容页Content.aspx页面代码:
<%@ Page Language="C#" MasterPageFile="~/ChildPage.master" AutoEventWireup="true" CodeFile="ContentPage.aspx.cs" Inherits="ContentPage" %>
- <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
- </asp:Content>
4、内容页content.aspx初始化childPage.master的GridView控件
- ContentPlaceHolder cont = this.Master.Master.FindControl("ContentPlaceHolderMain") as ContentPlaceHolder;
- GridView dl = cont.FindControl("gv_ChildMenu") as GridView;
- List<ChildMenu> list = new List<ChildMenu>();
- int i = 0;
- while (i <= id)
- {
- ChildMenu menu = new ChildMenu();
- menu.ChildMenuName = "菜单"+id+"的子菜单" + i;
- list.Add(menu);
- i++;
- }
- dl.DataSource = list;
- dl.DataBind();
按正常思路:内容页调用母版页应该用这段代码即可
GridView dl = this.Master.FindControl("gv_ChildMenu") as GridView;
就可以得到ChildPage.master的GridView控件对象。
但是ChildPage.master本身是继承自母版页MasterPage.master,所以上述的代码无法得到GridView对象
页必须这样写:
ContentPlaceHolder cont = this.Master.Master.FindControl("ContentPlaceHolderMain") as ContentPlaceHolder;
GridView dl = cont.FindControl("gv_ChildMenu") as GridView;
先获取Masterpage.master的ContentPlaceHolder对象,然后再通过该对象寻找childPage.master的GridView控
件对象,然后进行初始化。
详细源码示例下载地址:http://download.csdn.net/source/2077818