A
Aren Cambre
I have had a vexing problem with composite custom controls and how
their CreateChildControls method is fired.
I have a composite control which contains CheckBox controls. The
composite control sits in a Panel.
I also have two standalone Button controls. Button A's Click event
handler sets Panel.Visible = false. Button B's Click event handler
attempts to read the Checked properties of the CheckBox controls in
the composite control in the Panel.
If I press button B without pressing button A, then B's Click event
handler works fine: it can read the Checked properties of the CheckBox
controls. However, if I press button B after button A (that is, read
the child controls after setting Panel.Visible = false), then button
B's Click event handler encounters the composite controls with no
child controls. Their CreateChildControls methods were not called, and
Control.HasControls() returns false.
Normally CreateChildControls is fired early enough that a button Click
event handler can access the child controls of the composite control.
However, if I set Panel.Visible = false and then post back again, the
CreateChildControls method is called very late in the page's
lifecycle, making it impossible for me to do anything with the Child
Controls even in the Page's Init and Load event handlers.
This appears to be an inconsistency within ASP.Net.
I have discovered two workarounds:
1. Instead of using Panel.Visible = false, do Panel.Style["display"] =
"none". This way the custom controls still render, but the browser
just does not display them. You are depending on an "honest" client,
however, so this may not be preferred.
2. Before you access any child controls of a composite control, have
that control call its EnsureChildControls() method. According to MS's
documentation, this will set ChildControlsCreated = true and call the
CreateChildControls method.
Aren Cambre
Southern Methodist University
their CreateChildControls method is fired.
I have a composite control which contains CheckBox controls. The
composite control sits in a Panel.
I also have two standalone Button controls. Button A's Click event
handler sets Panel.Visible = false. Button B's Click event handler
attempts to read the Checked properties of the CheckBox controls in
the composite control in the Panel.
If I press button B without pressing button A, then B's Click event
handler works fine: it can read the Checked properties of the CheckBox
controls. However, if I press button B after button A (that is, read
the child controls after setting Panel.Visible = false), then button
B's Click event handler encounters the composite controls with no
child controls. Their CreateChildControls methods were not called, and
Control.HasControls() returns false.
Normally CreateChildControls is fired early enough that a button Click
event handler can access the child controls of the composite control.
However, if I set Panel.Visible = false and then post back again, the
CreateChildControls method is called very late in the page's
lifecycle, making it impossible for me to do anything with the Child
Controls even in the Page's Init and Load event handlers.
This appears to be an inconsistency within ASP.Net.
I have discovered two workarounds:
1. Instead of using Panel.Visible = false, do Panel.Style["display"] =
"none". This way the custom controls still render, but the browser
just does not display them. You are depending on an "honest" client,
however, so this may not be preferred.
2. Before you access any child controls of a composite control, have
that control call its EnsureChildControls() method. According to MS's
documentation, this will set ChildControlsCreated = true and call the
CreateChildControls method.
Aren Cambre
Southern Methodist University