We help IT Professionals succeed at work.
Get Started

Removing and Recreating Dynamically Created Controls inside an Event

LexiksTalionis
on
295 Views
Last Modified: 2012-05-11
Hi,

I'm trying to build a simple custom paginator. But I came across a specific problem, which I guess should be a common problem while creating a user control.

I'm dynamically creating controls inside the user control. When the user fires an event, I'm clearing the whole controls and dynamically creating them again. OK, at this point the control that I'm trying to create is important. The control as I said is a paginator control. There are LinkButtons which links to certain pages like "1, 2, 3, Next, Previous" and so.

As long as the controls are dynamically created, I should recreate them in Page_Load after each postback exactly the same to be able to catch events. I mean their IDs, CommandNames should all be exactly the same with before PostBack.

After that, I catch the event. Say the user clicked LinkButton with text "4" to navigate to fourth page. Inside the event I clear all the LinkButtons created before and recreate them. I recreate them because, the CurrentPage has changed to page "4". And the LinkButton at the center should be "4".

Ok, the problem happens here, altough I have deleted all previously created LinkButtons, If I create a new LinkButton with the same ID (BTW I'm giving them ID's by the page numbers they should redirect to), I get an error as "Sys.WebForms.PageRequestManagerServerErrorException: Multiple controls with the same ID"

This should be directly related to inner ASP.NET mechanism. I guess as long as I'm doing this inside an event there should be some problem with Page LifeCycle or so. May be I should do more than clearing them.

protected void Page_Load(object sender, EventArgs e)
        {
            panelPaginator.CssClass = CssClass;
            panelPaginator.Attributes.Add("style", style);

            string alignStr = "left";
            switch (Align)
            {
                case HorizontalAlign.Center: alignStr = "center"; break;
                case HorizontalAlign.Left: alignStr = "left"; break;
                case HorizontalAlign.Right: alignStr = "right"; break;
                case HorizontalAlign.Justify: alignStr = "center"; break;
                case HorizontalAlign.NotSet: alignStr = "left"; break; 
            }

            tdPaginator.Attributes.Add("style", "text-align:" + alignStr);
        }

        protected void lbNavigator_Click(object sender, EventArgs e)
        {
            int pageToGo = PageNumber;
            try { pageToGo = Int32.Parse((sender as LinkButton).CommandName); }
            catch (Exception ex)
            {
                string command = (sender as LinkButton).CommandName;
                if (command.Equals("Previous"))
                {
                    if (PageNumber - 1 == 0)
                    {
                        pageToGo = 1;
                    }
                    else
                    {
                        pageToGo = PageNumber - 1;
                    }
                }
                else if (command.Equals("Next"))
                {
                    double tempDouble = TotalItems / ItemPerPage;
                    int totalNumberPages = Int32.Parse(Math.Ceiling(tempDouble).ToString());

                    if (PageNumber + 1 == totalNumberPages)
                    {
                        pageToGo = PageNumber;
                    }
                    else
                    {
                        pageToGo = PageNumber + 1;
                    }
                }
            }

            PageNumber = pageToGo;

            Navigate(this, new NavigateEventArgs(PageNumber, ItemPerPage, TotalItems));

            PopulateNavigationButtons();
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            PopulateNavigationButtons();
        }

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            EnsureChildControls();
        }

        protected void PopulateNavigationButtons()
        {
            panelPaginatorInner.Controls.Clear();

            double tempDouble = TotalItems / ItemPerPage;
            int totalNumberPages = Int32.Parse(Math.Ceiling(tempDouble).ToString());
            LinkedList<LinkButton> navigators = new LinkedList<LinkButton>();

            int maxLength = totalNumberPages < 9 ? totalNumberPages : 9;
            int lowNum = PageNumber;
            int highNum = PageNumber;

            navigators.AddFirst(GetLinkButton(PageNumber.ToString(), PageNumber.ToString(), "PaginatorNavigatorLink ActivePaginatorNavigatorLink"));

            while (navigators.Count < maxLength && totalNumberPages > 1)
            {
			    lowNum = lowNum - 1;
			    highNum = highNum + 1;
			    if(lowNum > 0){
                    navigators.AddFirst(GetLinkButton(lowNum.ToString(), lowNum.ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
			    }
                if(highNum <= totalNumberPages){
                    navigators.AddLast(GetLinkButton(highNum.ToString(), highNum.ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
			    }
		    }

            if((lowNum - 1) > 3)
            {
                navigators.AddFirst(GetLinkButton("", "...", "PaginatorDot"));
                navigators.AddFirst(GetLinkButton(2.ToString(), 2.ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
                navigators.AddFirst(GetLinkButton(1.ToString(), 1.ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
            }

            if ((totalNumberPages - highNum) > 3)
            {
                navigators.AddLast(GetLinkButton("", "...", "PaginatorDot"));
                navigators.AddLast(GetLinkButton((totalNumberPages - 1).ToString(), (totalNumberPages - 1).ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
                navigators.AddLast(GetLinkButton(totalNumberPages.ToString(), totalNumberPages.ToString(), "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
            }

            navigators.AddFirst(GetLinkButton("Previous", "<< ├ľnceki", "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
            navigators.AddLast(GetLinkButton("Next", "Sonraki >>", "PaginatorNavigatorLink InActivePaginatorNavigatorLink"));
            
            foreach (LinkButton l in navigators)
            {
                panelPaginatorInner.Controls.Add(l);
            }
        }

        private LinkButton GetLinkButton(string commandName, string text, string cssClass)
        {
            LinkButton lbNavigator = new LinkButton();
            lbNavigator.CommandName = commandName.ToString();
            lbNavigator.ID = "NavigatorLink" + commandName;
            lbNavigator.Text = text.ToString();
            if (commandName.Equals("Previous")) { lbNavigator.Attributes.Add("style", "margin:0px 1px 0px 0px;"); }
            if (commandName.Equals("Next")) { lbNavigator.Attributes.Add("style", "margin:0px 0px 0px 1px;"); }
            lbNavigator.Click += new EventHandler(lbNavigator_Click);
            lbNavigator.Attributes.Add("class", cssClass);
            return lbNavigator;
        }

Open in new window

Comment
Watch Question
Scrum Trainer | Microsoft MVP | ALM Ranger | Consultant
CERTIFIED EXPERT
Commented:
This problem has been solved!
Unlock 1 Answer and 4 Comments.
See Answer
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE