C# 直接从ascx设置codebehind公共属性
我有三个用户控件:C# 直接从ascx设置codebehind公共属性,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有三个用户控件:usercontrolA、usercontrolB和usercontrolC,它们都共享相同的代码,每个都有: 位于ascx顶部 在codebehind文件中,我有一个名为ShowAll的公共属性 我知道当我在页面上放置usercontrol时,我可以设置这个属性 但是,我希望在usercontrolB上始终将ShowAll设置为true,这样就不必每次将其放置在页面上时都将其设置为true 我知道我可以向usercontrolB添加一个脚本标记,以便在页面加载中设置Show
usercontrolA
、usercontrolB
和usercontrolC
,它们都共享相同的代码,每个都有:
位于ascx顶部
在codebehind文件中,我有一个名为ShowAll
的公共属性
我知道当我在页面上放置usercontrol时,我可以设置这个属性
但是,我希望在usercontrolB上始终将ShowAll设置为true,这样就不必每次将其放置在页面上时都将其设置为true
我知道我可以向usercontrolB添加一个脚本标记,以便在页面加载中设置ShowAll
:
<script runat="server">
protected void Page_Load(object sender, System.EventArgs e)
{
ShowAll = true;
}
</script>
受保护的无效页面加载(对象发送方,System.EventArgs e)
{
ShowAll=true;
}
但是我想保留我在codebehind中已有的页面加载
实现是否有其他方法自动为usercontrolB设置此属性?
编辑:如果可能,我希望能够在ascx中而不是在代码隐藏中进行设置,这样以后其他人就可以为
usercontrolD
的所有实例添加usercontrolD
,并将ShowAll
设置为true,而无需让我修改和重新编译代码隐藏。在代码隐藏中,您可以检查实例类型:
protected void Page_Load(object sender, System.EventArgs e)
{
if (this is usercontrolB)
{
ShowAll = true;
}
}
您必须在usercontrol类构造函数中设置它
public ConstructorClassName()
{
ShowAll = true;
}
这里是完整的例子与代码
public partial class WebUserControl : System.Web.UI.UserControl
{
public WebUserControl()
{
ShowAll = true;
}
private bool _showAll;
public bool ShowAll
{
get { return _showAll; }
set { _showAll = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
我将默认值设置为true,但您也可以在添加此用户控件的位置传递该值。e、 g
<uc1:usercontrolB ID="usercontrolB1" runat="server" ShowAll="false" />
调用此函数时,它会将值覆盖为
false
为什么必须在后面共享代码?@Arief,这是面向对象编程的主要原则之一。@Arief为了避免在本质上相同的控件中重复大量代码,但html标记会有所不同,我的意思是如果您有不同的行为,首先,为什么要共享相同的代码?你不能使用继承吗?cc@kon您遇到的问题类型应该引起注意。也许是时候备份和重构您的设计了。看起来这确实是一个继承的候选,而不是完全的代码共享。但是由于它们共享同一个codebehind,我没有usercontrolB类,所以我肯定无法检查(这是usercontrolB)?根据您的示例代码:
,您定义了usercontrolB类(这是usercontrolB)
正在检查类型,而不是用户控件的名称。是的-我没有定义usercontrolB类,尽管我只是在我的aspx页面顶部有
,它允许我像以前一样引用usercontrol。我有三个usercontrols,它们的代码隐藏都有usercontrolA.ascx.cs
,并且都继承了usercontrolA
,因为这三个控件共享相同的代码隐藏,如何仅为usercontrolB设置属性?当然-但问题是,是否有任何方法可以做到这一点,而不必每次将usercontrolB放在页面上时都这样做?答案很可能是这不可能!你能再解释一下吗,我不明白你的意思。您实际想要什么?是否有任何方法可以从ascx页面本身设置codebehind属性,例如,可能在脚本标记中,如在我的示例中(但不隐藏codebehind的页面加载)?这就是从aspx页面设置的内容,它会将codebehind设置为true。你能测试一下吗?