Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 直接从ascx设置codebehind公共属性_C#_Asp.net_User Controls - Fatal编程技术网

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。你能测试一下吗?