C# 重写自定义控件中的控件属性是个坏主意吗?
我正在尝试创建一个web partish自定义控件。我将使用Mono,所以不,我不能只使用ASP.Net(这是我们决定使用Mono之前使用的) 基本上,我们希望有一个名为C# 重写自定义控件中的控件属性是个坏主意吗?,c#,asp.net,custom-controls,overriding,C#,Asp.net,Custom Controls,Overriding,我正在尝试创建一个web partish自定义控件。我将使用Mono,所以不,我不能只使用ASP.Net(这是我们决定使用Mono之前使用的) 基本上,我们希望有一个名为WebPart的自定义控件,它是web部件派生的抽象类 在WebPart类中,我希望它基本上只包含标题和内容(两者都能够应用样式表) 现在,我基本上只是在WebPart构造函数中,在控件的位置0处添加了一个标签和面板,以便呈现标题(标签放在面板中)。现在,我的问题来了。没有一种简单的方法可以包含Web部件的内容(对于派生控件来说
WebPart
的自定义控件,它是web部件派生的抽象类
在WebPart
类中,我希望它基本上只包含标题和内容(两者都能够应用样式表)
现在,我基本上只是在WebPart
构造函数中,在控件的位置0处添加了一个标签和面板,以便呈现标题(标签放在面板中)。现在,我的问题来了。没有一种简单的方法可以包含Web部件的内容(对于派生控件来说,它只是普通标记之类的),这样我就可以将样式类分别应用于派生控件的内容和标题
我看到的唯一解决方案是为标题和内容设置一个面板,然后覆盖WebPart.Controls
,这样Controls=pnlContent.Controls
这意味着什么?这会弄乱UniqueID或javascript吗?有没有更好的办法?对于自定义控件,这是正常的操作吗
重写自定义控件的控件
索引器指向另一个控件的控件
属性会遇到什么问题
我提议的课程是这样的(简化了很多)
另外,由于我隐藏了base.Controls属性,ASP.Net在呈现此属性时会出现问题吗?(因此,它只会呈现pnlContent.Controls
而不会呈现this.Controls
?)我认为最大的问题是释放资源。从MSDN:
释放所使用的非托管资源
由控件及其子控件创建
并且可以选择释放托管
资源
所以,如果你不照顾好自己,你可能会泄漏内存。除此之外,我不认为还有太多其他问题需要担心。根据你的评论,你难道不能写这样的东西吗(我不知道Mono,所以如果这完全是胡说八道的话,就忽略它——在ASP.net中,我也会这样写)
这只是演示了如何将css类单独添加到复合服务器控件中。基本上,您只需将属性的设置传播到子控件
我不知道你到底想达到什么目标,但你应该看看这门课
对于您关于覆盖控件集合的问题:当我创建自定义服务器控件时,更改的可能性较小。服务器控件必须在许多不同的情况下工作,嵌套在usercontrols中,可能嵌套在其他模板控件中。这可能会很快导致奇怪的副作用,这些副作用很难跟踪。在UI开发的标准化过程中,我已经创建了一系列控件,而且我从来没有覆盖过WebControl甚至控件的基本属性。作文大部分时间都很好。这并不能真正回答问题。。但是我们只是重写RenderControl来呈现一些额外的内容,而不是试图重写Controls方法。似乎覆盖控件的工作一直持续到onchange事件和viewstate 你能进一步解释一下吗?“没有简单的方法来包含Web部件的内容(它将只是普通的标记,并且类似于派生控件),这样我就可以将样式类分别应用于派生控件的内容和标题。”基本上,这样我就可以执行类似于lblTitle.CssClass=“foo”
和pnlContent.CssClass=“bar”的操作
是,但使用此选项,每当您创建从此控件派生的新控件时,新控件的标记(内容)最终不会进入panelContent
。因此,您无法控制所创建控件的CSS。而且,ASP.Net只是在一个框架上运行的东西。它在Mono和微软的.Net.Hmm上都能工作……但是如果你用模板而不是面板,它就会工作,对吗?我不确定我是否得到了你真正想要的这个WebPart控件。但是如果你想让它成为s.t.所有的控件都有一个标题+内容,那么它应该和一个模板控件一起工作。基本上,您的子控件只分配在“basecontrol”内容区域中实例化的模板。
abstract class WebPart{
protected lblTitle=new Label();
protected pnlContent=new Panel();
public ControlCollection Controls{
get{
return pnlContent.Controls;
}
}
public WebPart(){
base.Controls.Add(lblTitle);
base.Controls.Add(pnlContent);
}
}
public class MyCustomServerControl : CompositeControl
{
private Label labelTitle;
private Panel panelContent;
public override CreateChildControls()
{
base.Controls.Clear();
labelTitle = new Label();
labelTitle.ID = "lblTitle";
panelContent = new Panel();
panelContent.ID = "pnlContent";
this.Controls.Add(labelTitle);
this.Controls.Add(panelContent);
}
[Browsable(true)]
public string LabelCssClass
{
get
{
EnsureChildControls();
return labelTitle.CssClass;
}
set
{
EnsureChildControls();
labelTitle.CssClass = value;
}
}
[Browsable(true)]
public string PanelContentCssClass
{
get
{
EnsureChildControls();
return panelContent.CssClass;
}
set
{
EnsureChildControls();
panelContent.CssClass = value;
}
}
...
}