0

私はカスタムコントロールで遊んでいるだけで、次のように構築されています:

<cc:Test ID="jqTestTest01" runat="server" OnTestClick="jqTestTest01_TestClick">
    <TestItems>
            <asp:ListItem Text="Tab One" Value="1" Selected="True" />
            <asp:ListItem Text="Tab Two" Value="2" />
            <asp:ListItem Text="Tab Three" Value="3" />
            <asp:ListItem Text="Tab Four" Value="4" />
            <asp:ListItem Text="Tab Five" Value="5" />
    </TestItems>
    <ContentTemplate>
            <asp:Label ID="lblTestTest01" runat="server" Text="None" />            
    </ContentTemplate>    
</cc:Test>

protected void jqTestTest01_TestClick(object sender, EventArgs e)
{
    lblTestTest01.Text = "Click Event! " + DateTime.Now.ToLongTimeString();        
}

私が持っているコードでは、最初のロードですべてがうまくレンダリングされます。クリックすると発生するリスト項目に関連付けられたイベントもあり、それは機能します。問題は、カスタム コントロールの更新が行われていないことです。この例では、ユーザーが最後にクリックしたリスト項目を無効にし、他のすべてが有効になっていることを確認しようとしています。コントロールのコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

namespace MyControls.jqTest
{
    [ParseChildren(true), PersistChildren(false)]
    public class Test : WebControl, INamingContainer
    {
        [ParseChildren(true, "Items")]
        public class iTestItems
        {
            private ListItemCollection _Items;

            [DefaultValue((string)null), MergableProperty(false), PersistenceMode(PersistenceMode.InnerDefaultProperty)]
            public virtual ListItemCollection Items
            {
                get
                {
                    if (_Items == null)
                        _Items = new ListItemCollection();

                    return _Items;
                }
            }
        }

        private iTestItems _TestItems = null;
        private ITemplate _ContentTemplate = null;
        public event EventHandler TestClick = null;

        [PersistenceMode(PersistenceMode.InnerProperty),
         TemplateContainer(typeof(iTestItems)),
         TemplateInstance(TemplateInstance.Single)]
        public iTestItems TestItems
        {
            get { return _TestItems; }
            set { _TestItems = value; }
        }

        [PersistenceMode(PersistenceMode.InnerProperty),
         TemplateContainer(typeof(TemplateControl)),
         TemplateInstance(TemplateInstance.Single)]
        public ITemplate ContentTemplate
        {
            get { return _ContentTemplate; }
            set { _ContentTemplate = value; }
        }

        protected override void CreateChildControls()
        {
            Controls.Clear();
            Control BtnList = new Control();            
            Controls.Add(BtnList);

            Control Content = new Control();
            ContentTemplate.InstantiateIn(Content);
            Controls.Add(Content);
        }

        void Btn_Click(object sender, EventArgs e)
        {
            Button Btn = (Button)sender;
            foreach (ListItem i in _TestItems.Items)
                i.Selected = (i.Text == Btn.Text) ? false : true;

            if (TestClick != null)
                TestClick(sender, e);
        }

        protected override void Render(HtmlTextWriter writer)
        {

            Control BtnList = Controls[0];
            BtnList.Controls.Clear();

            foreach (ListItem i in _TestItems.Items)
            {
                Button Btn = new Button();
                Btn.Text = i.Text;
                Btn.Enabled = i.Selected ? false : true;
                Btn.Click += new EventHandler(Btn_Click);
                BtnList.Controls.Add(Btn);
            }

            base.Render(writer);
        }


    }
}

私が正しく行っていないのは、Rendering / CreateChildren プロセスであると確信しています。問題は、何かを更新する必要があるときにユーザーコントロールを再レンダリングする方法を示す良い例が見つからないことです。これを行う正しい方法はありますか?

4

1 に答える 1

1

Render()メソッド内のすべてがメソッド内にある必要があるように思えますCreateChildControls()

Renderコントロールによって出力される実際の HTML をオーバーライドするためのものです。ライフサイクルの後半で、応答ストリームが生成されるときに呼び出されます。

CreateChildControlsライフサイクルのいくつかの時点で呼び出すことができ、ViewState の処理中など、コントロールを初めてインスタンス化する必要があるときに呼び出されます。

于 2010-01-26T22:01:04.593 に答える