سؤال

لقد قمت حاليا ببناء Clointecontrol يتصرف مشابها إلى تسمية (obdercontrolid) للتحكم في حالة الانهيار للتحكم.

التحكم التالية أود بناء:

Clappsablearea http://img692.imageshack.us/img692/3307/stackoverflowcollapeab.jpg.

فكرت في شيء مثل:
ضع قوتي بالفعل CollapsableControl وبعض السيطرة الأخرى (على سبيل المثال. لوحة) معا للحصول على clapsablearearea.

أول محاولة:
حاولت تمديد لوحة وفعل ما يلي:

this.Parent.Controls.Add(collapsableControl);

ولكن هذا أعطاني: "عدم تصحيح دورة حياة الحياة"، "لا يمكن تعديل"، "noullareference"، استثناءات

لذلك أعطيتها تجربة أخرى (التي أعتقد أن الخيار الأفضل، بسبب عدم الحصول على أي تاجكي):
امتدت عنصر نائب وفعل ما يلي:

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

تسبب ذلك في مشاكل أخرى، مثل: أريد فقط تعيين نص اللوحة، وأسلوب اللوحة، ...

سلكي

هل لديك أي حلول لهذا السيناريو؟

تعديل:
توصلت إلى حل آخر:
حل آخر http://img109.imageshack.us/img109/3307/stackoverflowcollapeab.jpg.

"Collapsablearea" هو نوع "التحكم"، تحتوي على خصائص خاصة 2 إضافية:

  1. "clipapsableControl"
  2. "لوجة"

اعتقدت أنه سيكون كافيا، لإعادة توجيه Getter of the clappsablearea.controls إلى clappsablearea.panel.controls. في clappsablearea.createchildcontrols () أنا intanciate وإضافة clapsableControl واللوحة إلى base.controls وفي clappsablearea.renderchildren () تقديم تلك 2

مشاكلي الآن: سيحصل CollapsableControl على عميل (بدون تحديد معرف) - لن يؤدي اللوحة إلى تقديم clapsableControl (أو تمريرها)، إذا كانت اللوحة تحتوي على <٪٪> Tags

أي اقتراحات؟

تعديل:لقد قمت بإصلاح سلوك المعرف المفقود - فقط قم بتعيين CollapsableControl.associatedcontrolid إلى لوحة.Clientid ... ولكن - عند وضع <٪٪> في اللوحة، لن يتم تقديمها؟

هل كانت مفيدة؟

المحلول 2

أوه، كيف يأتي - لقد حل هذه المشكلة:

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

نصائح أخرى

إذا كنت بعد لوحة بسيطة، فقم بإعادة اختراع العجلة، يمكنك استخدام عنصر تحكم اللوحة القابلة للطي:

http://www.asp.net/ajax/ajaxcontroltoolkit/samples/collapsibanel/collapsiblpanel.aspx.

قد تكون أسهل طريقة للحصول على وظائفك بعد؟

يجب أن يحصل عنصر التحكم الخاص بك على خاصية عنصر تحكم القالب لتعريف المحتوى القابل للانهيار. وكما قلت الخاصية المرتبطة التي تحصل على معرف التحكم في الملصقات.

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

يجب عليك تسجيل مسج إلى البرامج النصية للبدء من الصفحة.

$("#The AssociatedControlID client control id").click(function(e) {
    $("#The CollapsableArea client control id").toggle();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top