Создание сворачиваемой области в ASP.NET - PullRequest
0 голосов
/ 11 ноября 2009

В настоящее время я построил collapseControl, который ведет себя подобно метке (relatedControlID) для управления состоянием свертывания элемента управления.

следующий контроль, который я хотел бы построить:

складная зона http://img692.imageshack.us/img692/3307/stackoverflowcollapseab.jpg

я думал о чем-то вроде:
поместите мой уже собранный collapsableControl и некоторые другие элементы управления (например, панель) вместе, чтобы получить зону collapsableArea.

первая попытка:
я попытался расширить панель и сделал следующее:

this.Parent.Controls.Add(collapsableControl);

но это дало мне: "неверный шаг жизненного цикла", "невозможно изменить", "nullReference", ... исключения

поэтому я дал ему еще одну попытку (что, я считаю, лучший выбор из-за отсутствия tagKey):
я расширил заполнитель и сделал следующее:

this.Controls.Add(collapsableControl);
this.Controls.Add(collapsablePanel);

это вызвало другие проблемы, такие как: я только хочу установить текст панели, стиль панели, ...

проводной!

есть ли у вас какие-либо решения для этого сценария?

редактирование:
я придумал другое решение:
другое решение http://img109.imageshack.us/img109/3307/stackoverflowcollapseab.jpg

«CollapsableArea» относится к типу «Control» и содержит 2 дополнительных личных свойства:

  1. "CollapsableControl"
  2. "Группа"

Я подумал, что этого будет достаточно, чтобы перенаправить метод получения CollapsableArea.Controls в CollapsableArea.Panel.Controls. в CollapsableArea.CreateChildControls () я инстанцирую и добавляю CollapsableControl и Panel к base.Controls и в CollapsableArea.RenderChildren () отображает эти 2

мои проблемы сейчас: CollapsableControl получит идентификатор клиента (без установки идентификатора) - панель не будет Визуализация CollapsableControl завершится ошибкой (или будет отключена), если панель содержит <%%> - теги

есть предложения?

редактирование: я исправил поведение отсутствующего идентификатора - просто установите CollapsableControl.AssociatedControlID в Panel.ClientID ... но - при помещении <%%> в панель он не будет отображаться ?? !!

Ответы [ 3 ]

0 голосов
/ 11 ноября 2009

Ваш элемент управления должен получить свойство элемента управления Template для определения сворачиваемого содержимого. И, как вы сказали, свойство AssociatedControlID, которое получает идентификатор элемента управления Label.

public class CollapsableArea : WebControl, INamingContainer
{
    public string AssociatedControlID { get; set; }
    public ITemplate ContentTemplate { get; set; }
}

Вы должны зарегистрировать jquery для скриптов запуска страницы.

$("#The AssociatedControlID client control id").click(function(e) {
    $("#The CollapsableArea client control id").toggle();
}
0 голосов
/ 13 ноября 2009

о, как получается - я решил эту проблему:

public sealed class CollapsableArea : Control
{
    private const string ViewStateKeyCollapsableContentClientID = "collapsableContentClientID";

    private string CollapsableContentClientID
    {
        get
        {
            var obj = this.ViewState[ViewStateKeyCollapsableContentClientID];
            if (obj == null)
            {
                var collapsableContentClientID = Guid.NewGuid().ToString();
                this.ViewState[ViewStateKeyCollapsableContentClientID] = collapsableContentClientID;
                return collapsableContentClientID;
            }
            return (string)obj;
        }
    }

    /// <summary>
    /// Gets or sets the header text.
    /// </summary>
    /// <value>The header text.</value>
    public string HeaderText
    {
        get
        {
            this.EnsureChildControls();
            return this._collapseControl.Text;
        }
        set
        {
            this.EnsureChildControls();
            this._collapseControl.Text = value;
        }
    }

    public override ControlCollection Controls
    {
        get
        {
            // redirect controls
            return this._collapsableContent.Controls;
        }
    }

    #region child controls

    private readonly Panel _collapsableContent = new Panel();
    private readonly CollapsableControl _collapseControl = new CollapsableControl();

    #endregion

    public override Control FindControl(string id)
    {
        // need to redirect
        if (string.Equals(id, this._collapsableContent.ID))
        {
            return this._collapsableContent;
        }
        return this._collapsableContent.FindControl(id);
    }

    protected override void CreateChildControls()
    {
        base.Controls.Clear();

        var collapsableContentClientID = this.CollapsableContentClientID;
        this._collapsableContent.ID = collapsableContentClientID;
        this._collapseControl.AssociatedControlID = collapsableContentClientID;
        base.Controls.Add(this._collapseControl);
        base.Controls.Add(this._collapsableContent);
    }

    protected override void RenderChildren(HtmlTextWriter writer)
    {
        this._collapseControl.RenderControl(writer);
        // hack for code blocks
        if (!this.Controls.IsReadOnly)
        {
            this._collapsableContent.RenderControl(writer);
        }
        else
        {
            this._collapsableContent.RenderBeginTag(writer);
            base.RenderChildren(writer);
            this._collapsableContent.RenderEndTag(writer);
        }
    }
}
0 голосов
/ 11 ноября 2009

Если вам нужна простая панель, а не изобретать колесо, вы можете использовать элемент управления «Складная панель»:

http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CollapsiblePanel/CollapsiblePanel.aspx

Может быть самый простой способ получить функциональность, к которой вы стремитесь?

...