Пользовательский элемент управления не отображается после события - PullRequest
0 голосов
/ 27 января 2010

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

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

1 Ответ

1 голос
/ 27 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...