C# UserControl的行为类似于asp.net中的面板

C# UserControl的行为类似于asp.net中的面板,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有几个自定义用户控件(100+),它们都有一个共同的格式,这基本上要求我们将用户控件包装在目标页面上的面板控件中。为了简单起见,我想创建一个基本控件来处理这个问题,因为几乎所有的基本特性对于每个自定义控件都是相同的 我所做的是创建一个基类,在该基类中我创建一个私有面板控件,然后覆盖渲染以生成base.Render周围的面板前/后标记 现在,这很好,因为我们关心的所有用户控件都继承了它,并且我们向继承的控件公开的一些格式项(宽度、CssClass等)都按预期工作 我真正想要的是通过基类将所有面板

我有几个自定义用户控件(100+),它们都有一个共同的格式,这基本上要求我们将用户控件包装在目标页面上的面板控件中。为了简单起见,我想创建一个基本控件来处理这个问题,因为几乎所有的基本特性对于每个自定义控件都是相同的

我所做的是创建一个基类,在该基类中我创建一个私有面板控件,然后覆盖渲染以生成base.Render周围的面板前/后标记

现在,这很好,因为我们关心的所有用户控件都继承了它,并且我们向继承的控件公开的一些格式项(宽度、CssClass等)都按预期工作

我真正想要的是通过基类将所有面板控件项公开给继承的控件,但不必授权属性/方法来公开每个元素

有没有什么好办法?我只是不想手动实现每个面板属性/方法。我们也使用了设计时属性(第一个是CssClass和Width),但我们一直在使用设计时属性

我们所做的一切都很有效,只是在寻找一个更简单/更好的解决方案

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public class BaseUserControl : System.Web.UI.UserControl
{
    private Panel _panel;
    private bool _isPanelLoaded;

    public Panel Panel
    {
        get
        {
            if (_panel == null)
            {
                _panel = new Panel();
                _isPanelLoaded = true;
            }
            return _panel;
        }
    }

    public BaseUserControl()
    {

    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (_isPanelLoaded)
        {
            Panel.RenderBeginTag(writer);
            base.Render(writer);
            Panel.RenderEndTag(writer);
        }
        else
        {
            base.Render(writer);
        }
    }

    public Unit Width
    {
        get
        {
            if (Panel.Width.IsEmpty)
            {
                return 0;
            }
            return Panel.Width;
        }
        set
        {
            Panel.Width = value;
        }
    }

    public string CssClass
    {
        get
        {
            return Panel.CssClass;
        }
        set
        {
            Panel.CssClass = value;
        }
    }
}

为了公开所有属性,必须从面板控件继承。因为您有一个面板属性,所以可以设置该属性的属性。在标记中定义它们是一项挑战。。。对于大多数简单对象,如果将属性设置为
,则可以访问
面板CssClass
的sytnax中的属性,但我不知道这是否适用于您,因为面板是一个控件。很好尝试


本质上讲,您是在编写一次属性来包装所需的属性,因此,如果前一种解决方案不起作用,那么最好就是这样做。

您不能直接通过Panel属性访问所有属性吗?或者您正在尝试在aspx页面中配置这些选项?您不能从Panel UserControl继承吗?重新包装属性是最快的解决方案。虽然花了一点时间,但我只是对所有的方法/属性进行了编码,以访问内部面板。