环境是这样的,一个MasterPage 如MP2(子)嵌套另一个MasterPage 如MP1(父)。一个UserControl 如MyUc,这个UserControl有一个Web控件,如TextBox1它初始状态为 Visible="false" ,它是拉在MP1的MasterPage上。 现在是要在MP2的MasterPage的page_Load控制UserControl内的TextBox显示与否。
这样的做法,就是所有使用MP1 MasterPage的网页对用户控件的TextBox是不可见,而使用MP2 MasterPage的网页对用户控件的TextBox是可见。
Insus.NET实现这个问题,也花上不少时间,虽然以前实现很多相似的,但都是有page内,而非是在MasterPage去操作。下面是实现过程:
写一个Interface(接口) ,设置用户控件内的TextBox是否显示,是让MyUc用户控件实作这个接口。
IVisible
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for IVisible
/// </summary>
namespace Insus.NET
{
public interface IVisible
{
void SetVisible(bool show);
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for IVisible
/// </summary>
namespace Insus.NET
{
public interface IVisible
{
void SetVisible(bool show);
}
}
MyUc用户控件实作上面接口:
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class MyUc : System.Web.UI.UserControl,IVisible
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void SetVisible(bool show)
{
this.TextBox1.Visible = show;
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class MyUc : System.Web.UI.UserControl,IVisible
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void SetVisible(bool show)
{
this.TextBox1.Visible = show;
}
}
接下来,再写一个接口,接口写了一个bool的属性,设法让实作这个接口的物件实作这个属性。:
ICtrlDisplay
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for ICtrlDisplay
/// </summary>
namespace Insus.NET
{
public interface ICtrlDisplay
{
bool ShowControl { set; }
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for ICtrlDisplay
/// </summary>
namespace Insus.NET
{
public interface ICtrlDisplay
{
bool ShowControl { set; }
}
}
因为MyUc UserControl 拉入MP1 MasterPage内。因此上面的接口ICtrlDisplay为之准备。
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class MP1 : System.Web.UI.MasterPage,ICtrlDisplay
{
protected void Page_Load(object sender, EventArgs e)
{
}
public bool ShowControl
{
set
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class MP1 : System.Web.UI.MasterPage,ICtrlDisplay
{
protected void Page_Load(object sender, EventArgs e)
{
}
public bool ShowControl
{
set
{
((IVisible)this.MyUc1).SetVisible(value);
}
}
}
((IVisible)this.MyUc1).SetVisible(value);
}
}
}
准备好上面过程,现在我们就可以以MP2的MasterPage的Page_Load事件中,控制到MyUc内的TextBox显示与否。
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class SubDirectory_MP2 : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
((ICtrlDisplay)this.Master).ShowControl = true; ;
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class SubDirectory_MP2 : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
((ICtrlDisplay)this.Master).ShowControl = true; ;
}
}
看看演示:
演示源程序: