【问题标题】:UserControl to behave like a panel in asp.netUserControl 的行为类似于 asp.net 中的面板
【发布时间】:2013-01-06 02:08:46
【问题描述】:

我有几个自定义用户控件(100 多个),它们都涉及通用格式,这基本上要求我们将用户控件包装在目标页面上的面板控件中。为简单起见,我想创建一个处理此问题的基本控件,因为每个自定义控件的几乎所有基本功能都是相同的。

我所做的是创建一个基类,在该基类中我创建一个私有面板控件,然后我覆盖 Render 以在 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;
        }
    }
}

【问题讨论】:

  • 你不能直接通过 Panel 属性访问它们吗?还是您尝试在 aspx 页面中配置这些选项?
  • 不能从 Panel UserControl 继承吗?

标签: c# asp.net user-controls


【解决方案1】:

为了公开所有属性,您必须从 Panel 控件继承。由于您有一个面板属性,您可以在该属性上设置属性。在标记中定义它们是一个挑战......对于大多数简单的对象,如果你给属性一个<PersistenceMode(PersistenceMode.Attribute)>的属性,你将能够访问Panel-CssClass的sytnax中的属性,但我不知道如果这对你有用,因为 Panel 是一个控件。很好尝试。

您实际上是在谈论编写包装您想要的属性的属性,所以如果前一个解决方案不起作用,最好这样做。

【讨论】:

  • 只重新包装属性是最快的解决方案。花了一点时间,但我只是编写了所有方法/属性来访问内部面板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多