2009-11-11 3 views
0

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

следующий элемент управления я хотел бы построить:

collapsableArea 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); 

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

проволокой!

У вас есть решения для этого сценария?

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

"CollapsableArea" имеет тип "Control", содержащий 2 дополнительные частные свойства:

  1. "CollapsableControl"
  2. "Панель"

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

моих проблем в настоящее время: CollapsableControl получит ClientId (без установки идентификатора) - панель не будет render CollapsableControl не удастся (или потерян), если панель содержит <%%> - теги

любые предложения?

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

ответ

0

ой, как идет - я уже решил эту проблему:

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

Если вы после простой панели, а затем заново изобретать колесо можно использовать Control Panel Складной:

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

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

+0

я знаю, что есть такой контроль, но: мы не хотим использовать ни атлас-рамки, ни его контроль. .. sry! плюс: мы не нуждаемся в таком полном-все-танцевом управлении ... мы фокусируемся на интеграции jQuery! –

+0

вы можете увидеть вопрос «какое ваше решение» более распространенным способом - я думаю, что объединение двух элементов управления является широко используемым сценарием! и с тех пор я не знаю (наилучшего) решения для этого сценария :) –

-1

Ваш элемент управления должен получить свойство управления шаблоном для определения сворачиваемого содержимого. И, как вы сказали, свойство 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

nope ... как я хочу элемент управления, который состоит из 2 элементов управления (collapsableControl, panel), которые я знаю @ CreateChildControls идентификатор элемента управления для связанного ControlID из collapsableControl. ваше решение уже захвачено моим реализованным collapsableControl - но для причин короткого замыкания я хочу создать collapsableArea ... –

+0

В чем причина? –

+0

«shorting-reason»: 80% использования collapsableControl будет в сочетании с простой старой панелью. почему каждый программист должен объявить 2 элемента управления, если их может быть только один? –