Пользовательский элемент управления не отображается после события

Я просто играю с пользовательскими элементами управления, и у меня есть один, который выглядит так:

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


person cschear    schedule 26.01.2010    source источник
comment
Только что проверил ответ POST - по какой-то причине метка обновляется, но отключенная кнопка возвращается в исходное состояние.   -  person cschear    schedule 27.01.2010


Ответы (1)


Мне кажется, что все внутри вашего метода Render() должно быть внутри вашего метода CreateChildControls().

Render предназначен для переопределения фактического HTML, который выводится вашим элементом управления. Он будет вызываться позже в жизненном цикле, когда генерируется поток ответов.

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

person womp    schedule 26.01.2010
comment
Все еще не идет. Событие щелчка срабатывает (метка обновляется), но выбранная кнопка не отключается. - person cschear; 27.01.2010