Hi,
I think it's reasonable. If we set visibility on certain stage before the
Render the Render may run/not run. Here's the source code of the
Control.RenderControl method and the RenderControlInternal method. Let's
see what happens there:
protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
{
if (!this.flags[0x10] && !this.flags[0x200])
{
HttpContext context = (this.Page == null) ? null :
this.Page._context;
if ((context != null) && context.TraceIsEnabled)
{
int bufferedLength = context.Response.GetBufferedLength();
this.RenderControlInternal(writer, adapter);
int num2 = context.Response.GetBufferedLength();
context.Trace.AddControlSize(this.UniqueID, num2 -
bufferedLength);
}
else
{
this.RenderControlInternal(writer, adapter);
}
}
}
private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter
adapter)
{
if (adapter != null)
{
adapter.BeginRender(writer);
adapter.Render(writer);
adapter.EndRender(writer);
}
else
{
this.Render(writer);
}
}
We can see if control's flags[0x10] is true the Render method will not run.
The flags[0x10] represents the visibility of the control. To confirm this
please try following code:
Panel p = new Panel();
protected void Page_Load(object sender, EventArgs e)
{
p.PreRender += new EventHandler(p_PreRender);
p.Visible = false;//comment this line to test
this.form1.Controls.Add(p);
}
protected override void OnSaveStateComplete(EventArgs e)
{
base.OnSaveStateComplete(e);
//set a breakpoint here and check p.flags[0x10] in the watch window.
}
void p_PreRender(object sender, EventArgs e)
{
}
Please feel free to ask if you have anything unclear.
Regards,
Allen Chen
Microsoft Online Community Support
--------------------
| From: "TS" <
[email protected]>
| References: <
[email protected]>
<
[email protected]>
| Subject: Re: Control life cycle events not firing when control is
invisible
| Date: Tue, 30 Sep 2008 14:23:32 -0500
| Lines: 105
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.3028
| X-RFC2646: Format=Flowed; Original
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028
| Message-ID: <#
[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet.buildingcontrols
| NNTP-Posting-Host: 168.38.106.193
| Path: TK2MSFTNGHUB02.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP05.phx.gbl
| Xref: TK2MSFTNGHUB02.phx.gbl
microsoft.public.dotnet.framework.aspnet.buildingcontrols:1124
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.buildingcontrols
|
| I see the problem. After pre-render, the control was made visible, so
during
| createChildControls & onPreRender the control was invisible but when
Render
| came it was visible so render ran.
|
| that seems a little weird behavior, seems like all or none should run.
|
|
| | > Hi,
| >
| > Based on my test, none of them will run if the control is invisible.
| > Here's
| > my test code:
| > public partial class WebForm1 : System.Web.UI.Page
| > {
| > protected void Page_Init(object sender, EventArgs e) {
| > MyControl p = new MyControl();
| > this.form1.Controls.Add(p);
| > p.Controls.Add(new TextBox());
| > p.Visible = false;
| >
| > }
| > }
| > public class MyControl : Panel
| > {
| > protected override void CreateChildControls()
| > {
| > base.CreateChildControls();
| > }
| > protected override void OnPreRender(EventArgs e)
| > {
| > base.OnPreRender(e);
| > }
| > protected override void Render(HtmlTextWriter writer)
| > {
| > base.Render(writer);
| > }
| > }
| >
| > Could you double check it? If the Render runs on your side please send
me
| > a
| > demo project that can reproduce this problem. My email is
| > (e-mail address removed).
| >
| >
| > Regards,
| > Allen Chen
| > Microsoft Online Support
| >
| > Delighting our customers is our #1 priority. We welcome your comments
and
| > suggestions about how we can improve the support we provide to you.
Please
| > feel free to let my manager know what you think of the level of service
| > provided. You can send feedback directly to my manager at:
| > (e-mail address removed).
| >
| > ==================================================
| > Get notification to my posts through email? Please refer to
| >
http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.
| >
| > Note: The MSDN Managed Newsgroup support offering is for non-urgent
issues
| > where an initial response from the community or a Microsoft Support
| > Engineer within 1 business day is acceptable. Please note that each
follow
| > up response may take approximately 2 business days as the support
| > professional working with you may need further investigation to reach
the
| > most efficient resolution. The offering is not appropriate for
situations
| > that require urgent, real-time or phone-based interactions or complex
| > project analysis and dump analysis issues. Issues of this nature are
best
| > handled working with a dedicated Microsoft Support Engineer by
contacting
| > Microsoft Customer Support Services (CSS) at
| >
http://support.microsoft.com/select/default.aspx?target=assistance&ln=en-us.
| > ==================================================
| > This posting is provided "AS IS" with no warranties, and confers no
| > rights.
| > --------------------
| > | From: "TS" <
[email protected]>
| > | Subject: Control life cycle events not firing when control is
invisible
| > | Date: Mon, 29 Sep 2008 13:10:15 -0500
| > | Lines: 7
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.3028
| > | X-RFC2646: Format=Flowed; Original
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028
| > | Message-ID: <
[email protected]>
| > | Newsgroups: microsoft.public.dotnet.framework.aspnet.buildingcontrols
| > | NNTP-Posting-Host: 168.38.106.193
| > | Path: TK2MSFTNGHUB02.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP02.phx.gbl
| > | Xref: TK2MSFTNGHUB02.phx.gbl
| > microsoft.public.dotnet.framework.aspnet.buildingcontrols:1121
| > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.buildingcontrols
| > |
| > | thru my testing it seems that neither createChildControls nor
| > onPreRender
| > | will run if the control is invisible, but Render still runs. Am i
| > correct
| > | and why does render run if the others dont?
| > |
| > | thanks for your input~!
| > |
| > |
| > |
| >
|
|
|