Home All Groups Group Topic Archive Search About

UpdatePanel and RecreateChildControls

Author
20 Sep 2007 5:17 PM
jeljeljel
I have a CompositeControl (called SimplePager) that creates an
UpdatePanel in its CreateChildControls override.  The CompositeControl
uses two LinkButtons to control the forward/backward state.  W/out the
use of the UpdatePanel it works just great.  However, as a learning
exercise I want to AJAXify the control.  I am placing the entire
control in an UpdatePanel.  During the link click event handler, I
make a call to RecreateChildControls() which throws an exception.

This is so close to working.  Can someone suggest how to accomplish
what I am trying to do with an UpdatePanel?

My class is copied below.

Thanks,
John


    public class SimplePager : CompositeControl
    {
        private int _currentRecord;
        private int _totalRecords;

        public SimplePager(int totalRecords)
        {
            _totalRecords = totalRecords;
            _currentRecord = 1;
        }

        protected override void OnInit(EventArgs e)
        {
            Page.RegisterRequiresControlState(this);

            EnsureChildControls();

            base.OnInit(e);
        }

        protected override void LoadControlState(object savedState)
        {
            int[] state;

            state = (int[])savedState;

            _currentRecord = state[0];
            _totalRecords = state[1];
        }

        protected override object SaveControlState()
        {
            int[] state;

            state = new int[] { _currentRecord, _totalRecords };

            return state;
        }

        protected override void CreateChildControls()
        {
            HtmlGenericControl div;
            LinkButton linkButton;
            UpdatePanel updatePanel;
            Label label;

            div = new HtmlGenericControl("div");
            Controls.Add(div);

            updatePanel = new UpdatePanel();
            updatePanel.ID = this.ID + "BWPagerUpdatePanel";
            updatePanel.ChildrenAsTriggers = true;
            updatePanel.UpdateMode =
UpdatePanelUpdateMode.Conditional;
            div.Controls.Add(updatePanel);

            linkButton = new LinkButton();
            linkButton.Text = "<< prev";
            linkButton.ID = "prevPage";
            linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

            linkButton = new LinkButton();
            linkButton.Text = "next >>";
            linkButton.ID = "nextPage";
            linkButton.Click += new EventHandler(linkButton_Click);

updatePanel.ContentTemplateContainer.Controls.Add(linkButton);

            label = new Label();
            label.ID = "SimplePagerTextBox";
            label.Text = String.Format("&nbsp;&nbsp;Page {0} of {1}",
_currentRecord, _totalRecords);
            updatePanel.ContentTemplateContainer.Controls.Add(label);

            base.CreateChildControls();
        }

        private void linkButton_Click(object sender, EventArgs e)
        {
            LinkButton linkButton = sender as LinkButton;

            if (PageChange != null)
            {
                switch (linkButton.ID)
                {
                    case "prevPage":
                        if (_currentRecord > 1)
                            _currentRecord--;
                        break;

                    case "nextPage":
                        if (_currentRecord < _totalRecords)
                            _currentRecord++;
                        break;
                }

                PageChange(this, _currentRecord);

                RecreateChildControls();
            }
        }

        public int CurrentRecord
        {
            get
            {
                return _currentRecord;
            }
        }

        public delegate void PageChangeEvent(object sender, int
newPage);
        public event PageChangeEvent PageChange;
    }

Author
22 Sep 2007 6:11 PM
Phil H
Dear jeljeljel

You make a call to RecreateChildControls() but no such method exists
in the code you present.

It's difficult to diagnose why a method is raising an exception if its
code is not shown. Or could that be the cause of the problem?


On 20 Sep, 18:17, jeljeljel <livermore.j***@gmail.com> wrote:
Show quote
> I have a CompositeControl (called SimplePager) that creates an
> UpdatePanel in its CreateChildControls override.  The CompositeControl
> uses two LinkButtons to control the forward/backward state.  W/out the
> use of the UpdatePanel it works just great.  However, as a learning
> exercise I want to AJAXify the control.  I am placing the entire
> control in an UpdatePanel.  During the link click event handler, I
> make a call to RecreateChildControls() which throws an exception.
>
> This is so close to working.  Can someone suggest how to accomplish
> what I am trying to do with an UpdatePanel?
>
> My class is copied below.
>
> Thanks,
> John
>
>     public class SimplePager : CompositeControl
>     {
>         private int _currentRecord;
>         private int _totalRecords;
>
>         public SimplePager(int totalRecords)
>         {
>             _totalRecords = totalRecords;
>             _currentRecord = 1;
>         }
>
>         protected override void OnInit(EventArgs e)
>         {
>             Page.RegisterRequiresControlState(this);
>
>             EnsureChildControls();
>
>             base.OnInit(e);
>         }
>
>         protected override void LoadControlState(object savedState)
>         {
>             int[] state;
>
>             state = (int[])savedState;
>
>             _currentRecord = state[0];
>             _totalRecords = state[1];
>         }
>
>         protected override object SaveControlState()
>         {
>             int[] state;
>
>             state = new int[] { _currentRecord, _totalRecords };
>
>             return state;
>         }
>
>         protected override void CreateChildControls()
>         {
>             HtmlGenericControl div;
>             LinkButton linkButton;
>             UpdatePanel updatePanel;
>             Label label;
>
>             div = new HtmlGenericControl("div");
>             Controls.Add(div);
>
>             updatePanel = new UpdatePanel();
>             updatePanel.ID = this.ID + "BWPagerUpdatePanel";
>             updatePanel.ChildrenAsTriggers = true;
>             updatePanel.UpdateMode =
> UpdatePanelUpdateMode.Conditional;
>             div.Controls.Add(updatePanel);
>
>             linkButton = new LinkButton();
>             linkButton.Text = "<< prev";
>             linkButton.ID = "prevPage";
>             linkButton.Click += new EventHandler(linkButton_Click);
>
> updatePanel.ContentTemplateContainer.Controls.Add(linkButton);
>
>             linkButton = new LinkButton();
>             linkButton.Text = "next >>";
>             linkButton.ID = "nextPage";
>             linkButton.Click += new EventHandler(linkButton_Click);
>
> updatePanel.ContentTemplateContainer.Controls.Add(linkButton);
>
>             label = new Label();
>             label.ID = "SimplePagerTextBox";
>             label.Text = String.Format("&nbsp;&nbsp;Page {0} of {1}",
> _currentRecord, _totalRecords);
>             updatePanel.ContentTemplateContainer.Controls.Add(label);
>
>             base.CreateChildControls();
>         }
>
>         private void linkButton_Click(object sender, EventArgs e)
>         {
>             LinkButton linkButton = sender as LinkButton;
>
>             if (PageChange != null)
>             {
>                 switch (linkButton.ID)
>                 {
>                     case "prevPage":
>                         if (_currentRecord > 1)
>                             _currentRecord--;
>                         break;
>
>                     case "nextPage":
>                         if (_currentRecord < _totalRecords)
>                             _currentRecord++;
>                         break;
>                 }
>
>                 PageChange(this, _currentRecord);
>
>                 RecreateChildControls();
>             }
>         }
>
>         public int CurrentRecord
>         {
>             get
>             {
>                 return _currentRecord;
>             }
>         }
>
>         public delegate void PageChangeEvent(object sender, int
> newPage);
>         public event PageChangeEvent PageChange;
>     }

AddThis Social Bookmark Button