maembe
maembe

Reputation: 1300

Set Properties of User Control on Event Using FindControl

I have a user control that is dynamically loaded in the the page load:

protected void Page_Load(object sender, EventArgs e)
{
    MyControl ctl = (MyControl)LoadControl(controlPath);
    ctl.ID = "mycontrol";
    this.MyControlPlaceHolder.Controls.Add(ctl);
}

Front End of the Page:

<asp:PlaceHolder runat="server" ID="MyControlPlaceHolder"></asp:PlaceHolder>

I have an click event on the page that initiates and postback and calls a method where I'm trying to find the control and set some properties:

        MyControl ctl = (MyControl)FindControl("mycontrol");
        if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

This is writing fail after the postback, so it seems like I'm doing something incorrectly in finding the control. What is the best way to do this?

EDIT:

I switched it to MyControl ctl = (MyControl)this.MyControlPlaceHolder.FindControl("mycontrol");

This made it so it was finding the control, however, when the control loads after the postback, it appears as though the property is not set.

Upvotes: 3

Views: 1141

Answers (3)

rene
rene

Reputation: 42494

You have to use a recursive FindControl implementation because FindControl will only find direct childs. Your control is inserted in a naming container at a lower level. A generic FindControlRecurisve from MSDN:

private Control FindControlRecursive(Control rootControl, string controlID)
{
    if (rootControl.ID == controlID) return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = 
            FindControlRecursive(controlToSearch, controlID);
        if (controlToReturn != null) return controlToReturn;
    }
    return null;
}

from MSDN

Or, if you only have one specific conatiner like in your sample:

MyControl ctl =  this.MyControlPlaceHolder.FindControl("mycontrol");

if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

ViewState enable your control

public class MyControl:Control
{
   public bool MyProperty
   {
       get 
       {
           return ViewState["my"] != null? (bool) ViewState["my"]: false; 
       }
       set 
       {
           ViewState["my"]  = value;
       }
   }
}

Upvotes: 2

Hoghweed
Hoghweed

Reputation: 1948

You added the Control in the controls collection of a placeholder. Apart of what control is your dynamically created control, if you want to looking for your dynamically added control in that way you have to do a recursive search starting from the root (maybe the page), so, if you surf over the net, you could find good solutions for that.

Personally I prefer solutions with: generics support and expressed as extension methods, so you could use the solution everywhere. These are some usefull links

  1. Recursive Find Control with generics
  2. Recursive Find Control with generics by extension method
  3. Recursive Find Control with generics by extension method and linq support/example

hope this helps

Upvotes: 0

Andyz Smith
Andyz Smith

Reputation: 708

Try moving the code to dynamically add the control into Init instead of load. I can't be sure but there are a lot of things that happen between Init and Load and if your control is not present and accounted for it may cause issues like this.

Upvotes: 0

Related Questions