Как предоставить свойства стиля дочернего элемента управления в пользовательском композитном WebControl - PullRequest
1 голос
/ 23 февраля 2010

Я пишу собственный составной WebControl и хочу представить стили дочерних элементов управления, которые он инкапсулирует, в конструкторе ASP.NET. Код, который у меня сейчас есть, похож на скелет ниже (который для простоты имеет только один дочерний элемент управления).

С помощью приведенного ниже кода я вижу свойство «ChildPanelStyle» в конструкторе, но когда я пытаюсь изменить одно из свойств (например, CssClass) в конструкторе, оно сразу же сбрасывает себя к значению по умолчанию. Похоже, что дизайнерская сериализация не происходит.

Что я делаю не так?

UPDATE

Добавление установщика для свойства style не помогает и не должно быть необходимым. Я обновил образец дополнительным свойством стиля, которое напрямую управляется пользовательским элементом управления, а не просто является свойством дочернего элемента управления.

Свойство HeaderStyle правильно сохраняется конструктором, а свойство ChildPanelStyle - нет.

Конечно, я мог бы управлять всеми своими стилями, такими как HeaderStyle, и применять их во время рендеринга, но я надеюсь, что есть более простое решение, при котором дочерние элементы управления могут позаботиться о себе, и мне не нужно никакого специального рендеринга. *

public class MyControl : CompositeControl
{
    Panel myChildPanel;

    protected override void CreateChildControls()
    {
        myChildPanel = new Panel();
        this.Controls.Add(myChildPanel);
    }

    [
    Category("Style"),
    Description("Child panel style"),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
    NotifyParentProperty(true),
    PersistenceMode(PersistenceMode.InnerProperty),
    ]
    public System.Web.UI.WebControls.Style ChildPanelStyle
    {
        get
        {
            EnsureChildControls();
            return this.myChildPanel.ControlStyle;
        }
    }

    [
    Category("Style"),
    Description("Header style"),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
    NotifyParentProperty(true),
    PersistenceMode(PersistenceMode.InnerProperty),
    ]
    public System.Web.UI.WebControls.Style HeaderStyle
    {
        get
        {
            if (_headerStyle == null)
            {
                _headerStyle = new Style();
                if (IsTrackingViewState)
                    ((IStateManager)_headerStyle).TrackViewState();
            }
            return _headerStyle;
        }
    }
    private System.Web.UI.WebControls.Style _headerStyle;

    // ... overrides for save/load/tracking ViewState omitted 

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        EnsureChildControls();
        base.Render(writer);
    }

}

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

У вас нет сеттера. К сожалению, вы не можете напрямую установить this.myChildPanel.ControlStyle, так как это свойство только для чтения, поэтому вам придется установить это свойства. Измените свойство ChildPanelStyle на следующее:

[
Category("Style"),
Description("Child panel style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style ChildPanelStyle
{
    get
    {
        EnsureChildControls();
        return this.myChildPanel.ControlStyle;
    }
    set
    {
        EnsureChildControls();
        this.myChildPanel.ControlStyle.BackColor = value.BackColor;
        this.myChildPanel.ControlStyle.BorderColor = value.BorderColor;
        this.myChildPanel.ControlStyle.BorderStyle = value.BorderStyle;
        this.myChildPanel.ControlStyle.BorderWidth = value.BorderWidth;
        this.myChildPanel.ControlStyle.CssClass = value.CssClass;
        this.myChildPanel.ControlStyle.Font.Bold = value.Font.Bold;
        this.myChildPanel.ControlStyle.Font.Italic = value.Font.Italic;
        this.myChildPanel.ControlStyle.Font.Name = value.Font.Name;
        this.myChildPanel.ControlStyle.Font.Names = value.Font.Names;
        this.myChildPanel.ControlStyle.Font.Overline = value.Font.Overline;
        this.myChildPanel.ControlStyle.Font.Size = value.Font.Size;
        this.myChildPanel.ControlStyle.Font.Strikeout = value.Font.Strikeout;
        this.myChildPanel.ControlStyle.Font.Underline = value.Font.Underline;
        this.myChildPanel.ControlStyle.ForeColor = value.ForeColor;
        this.myChildPanel.ControlStyle.Height = value.Height;
        this.myChildPanel.ControlStyle.Width = value.Width;
    }
}
0 голосов
/ 01 февраля 2012

Если ваш элемент управления получен из System.Web.UI.Control (что, скорее всего, верно в соответствии с симптомами), вы должны добавить следующие атрибуты, чтобы получить то, что вы хотите:

[ParseChildren(true)]
[PersistChildren(false)]
public class MyControl : CompositeControl
{
    ...
}

Это не обязательно при выводе из WebControl.


PS вам не нужен установщик для ... свойств стиля - но убедитесь, что эти стили действительно созданы при первой попытке их получить.

...