Groups | Blog | Home
all groups > asp.net building controls > december 2006 >

asp.net building controls : Can't find other Controls from my own Control


Benton
12/4/2006 11:15:31 AM
Hi there,

I'm creating a "PopUpDatePicker" control, inheriting from Hyperlink. The
goal is to click on that control, select a value from a Calendar and set
this date value to a target control, usually a TextBox.

Problem is on the OnPreRender event, where I try to find the target control.
The FindControl() method always return null there, that is, the specified
Target control is not found on the current page. Here's the event code:

protected override void OnPreRender(EventArgs e)

{

System.Web.UI.Page page = System.Web.HttpContext.Current.Handler as
System.Web.UI.Page;

Control control = page.FindControl(TargetControl);

if (control != null) // null is always returned here :(

this.Attributes.Add("onclick",
string.Format("window.open('DatePicker.aspx?field={0}', 'calendarPopup',
'width=230,height=209,resizable=no,statusbar=no');", control.ClientID));

base.OnPreRender(e);

}

And below is the full code-behind, too. The question is: Why is the
FindControl() method returning null here? The TargetControl property does
have the name of the target control on the page (I can see it with the VS
debugger) so that is not the problem. So what am I missing?

Thanks in advance,

-Benton

Full code-behind below:


using System;
using System.Drawing;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

[assembly: TagPrefix("Tenerife.WebControls", "Tenerife")]

namespace Tenerife.WebControls

{

[ToolboxData("<{0}:PopUpCalendar runat=server></{0}:PopUpCalendar>"),

ToolboxBitmap(typeof(Calendar))]

public class PopUpCalendar : HyperLink

{

public PopUpCalendar()

{

this.NavigateUrl = "javascript:;";

this.ImageUrl = "~/img/SmallCalendar.gif";

this.ToolTip = "Click to select date";

}

protected override void OnPreRender(EventArgs e)

{

System.Web.UI.Page page = System.Web.HttpContext.Current.Handler as
System.Web.UI.Page;

Control control = page.FindControl(TargetControl);

if (control != null) // This is always false :(

this.Attributes.Add("onclick",
string.Format("window.open('DatePicker.aspx?field={0}', 'calendarPopup',
'width=230,height=209,resizable=no,statusbar=no');", control.ClientID));

base.OnPreRender(e);

}

[IDReferenceProperty(typeof(Control))]

[Themeable(false)]

[TypeConverter(typeof(System.Web.UI.WebControls.ValidatedControlConverter))]

[DefaultValue("")]

public string TargetControl

{

get { return ViewState["TargetControl"] == null ? String.Empty :
ViewState["TargetControl"].ToString(); }

set { ViewState["TargetControl"] = value; }

}

}

}
Benton
12/4/2006 11:31:19 AM
[quoted text, click to view]

Adding something to my own question here. I've modified my OnPreRender event
to look like this:

protected override void OnPreRender(EventArgs e)
{

Control control = Page.FindControl(TargetControl);


this.Attributes.Add("onclick",
string.Format("window.open('DatePicker.aspx?field={0}', 'calendarPopup',
'width=230,height=209,resizable=no,statusbar=no');", control.ClientID));

base.OnPreRender(e);

}

This time I am not casting the current page from the current handler, I'm
just using the Page property the Hyperlink control inherited. However, the
result is just the same: FindControl() always returns null. What am I doing
wrong?

Thanks in advance,

-Benton
Benton
12/4/2006 11:59:44 AM
[quoted text, click to view]

Duh. Solved by using NamingContainer.FindControl() instead of
Page.FindControl(). Long live GoogleGroups. :)

Cheers,

-Benton


intrader
3/19/2007 11:56:41 AM
[quoted text, click to view]
Benton, I am browsing this old question. Do you understand why you
needed to use the NamingContainer.

I thought of asking you whether your textbox is in a composite control
along with the Calendar control. I would then understand why you can't
see it via the Page if your control does not implement NamingContainer;
only visible controls are those under the form directly.

Please let me know
AddThis Social Bookmark Button