Problem using AddHandler for dynamically created WebControls

  • Thread starter Nathan Sokalski
  • Start date
N

Nathan Sokalski

I am using the AddHandler statement to add a CheckedChanged event handler to
a series of RadioButtons that I create in a loop. However, the handler is
not being called for a reason I cannot determine. What is the problem? Here
is my code:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
currpoem = Server.UrlDecode(Request.QueryString("poem"))
Dim ratinglabels As New TableRow
Dim ratingselection As New TableRow
For i As Integer = 1 To 10
Dim currlabel As New TableCell
currlabel.EnableViewState = False
currlabel.Font.Names = New String() {"Arial", "Helvetica",
"Sans-Serif"}
currlabel.Font.Size = FontUnit.Medium
currlabel.HorizontalAlign = HorizontalAlign.Center
currlabel.Text = i
ratinglabels.Cells.Add(currlabel)

Dim currselection As New TableCell
Dim radioselection As New RadioButton
currselection.EnableViewState = False
currselection.HorizontalAlign = HorizontalAlign.Center
radioselection.GroupName = "poemscore"
radioselection.ID = "radScore" & i
AddHandler radioselection.CheckedChanged, AddressOf
Me.Rating_CheckedChanged
currselection.Controls.Add(radioselection)
ratingselection.Cells.Add(currselection)
Next
tblRatingChoices.Rows.Add(ratinglabels)
tblRatingChoices.Rows.Add(ratingselection)
lblRatePoem.Text = "Rate Poem:<br>" & currpoem
TitleBar.InnerText = "Rate Poem: " & currpoem
btnClose.Attributes.Add("onClick=", "window.close();")
End Sub

Private Sub Rating_CheckedChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs)
score = CByte(CType(sender, RadioButton).ID.Substring(8))
btnSubmit.Enabled = True
End Sub


When the page is run, everything looks as expected, but the CheckedChanged
event does not fire (or at least it does not call the Rating_CheckedChanged
procedure as expected). Any ideas? Thanks.
 
G

Guest

Nathan, the checked_changed event needs a "handles" clause. This is added by
default, but it will magically disappear if you, say, go into the html and
change the id of the control. Add your own "handles..." or start over.

Bill
 
M

Mythran

Nathan Sokalski said:
I am using the AddHandler statement to add a CheckedChanged event handler
to a series of RadioButtons that I create in a loop. However, the handler
is not being called for a reason I cannot determine. What is the problem?
Here is my code:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
currpoem = Server.UrlDecode(Request.QueryString("poem"))
Dim ratinglabels As New TableRow
Dim ratingselection As New TableRow
For i As Integer = 1 To 10
Dim currlabel As New TableCell
currlabel.EnableViewState = False
currlabel.Font.Names = New String() {"Arial", "Helvetica",
"Sans-Serif"}
currlabel.Font.Size = FontUnit.Medium
currlabel.HorizontalAlign = HorizontalAlign.Center
currlabel.Text = i
ratinglabels.Cells.Add(currlabel)

Dim currselection As New TableCell
Dim radioselection As New RadioButton
currselection.EnableViewState = False
currselection.HorizontalAlign = HorizontalAlign.Center
radioselection.GroupName = "poemscore"
radioselection.ID = "radScore" & i
AddHandler radioselection.CheckedChanged, AddressOf
Me.Rating_CheckedChanged
currselection.Controls.Add(radioselection)
ratingselection.Cells.Add(currselection)
Next
tblRatingChoices.Rows.Add(ratinglabels)
tblRatingChoices.Rows.Add(ratingselection)
lblRatePoem.Text = "Rate Poem:<br>" & currpoem
TitleBar.InnerText = "Rate Poem: " & currpoem
btnClose.Attributes.Add("onClick=", "window.close();")
End Sub

Private Sub Rating_CheckedChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs)
score = CByte(CType(sender, RadioButton).ID.Substring(8))
btnSubmit.Enabled = True
End Sub


When the page is run, everything looks as expected, but the CheckedChanged
event does not fire (or at least it does not call the
Rating_CheckedChanged procedure as expected). Any ideas? Thanks.

This is because you are creating the control in Page_Load, and then
attaching the event handler to it. During the next postback, the control
will get created again during page load and have the event handler attached
to it. But the code that actually sync's the event to the event handler has
already occured (before Page_Load is called)...therefore, you are expecting
an event to be raised even though there is no control even created for the
handler.

So, try placing the code you have in Page_Load to Initialize (or whatever
that darn method's name is). See if that works for ya :)

Mythran
 
N

Nathan Sokalski

That was my first idea when writing the page (to manually create each of the
RadioButtons rather than generate them), so I decided to do that. Here is
what I have now for the event handler:

Private Sub Rating_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles radSelection1.CheckedChanged,
radSelection2.CheckedChanged, radSelection3.CheckedChanged,
radSelection4.CheckedChanged, radSelection5.CheckedChanged,
radSelection6.CheckedChanged, radSelection7.CheckedChanged,
radSelection8.CheckedChanged, radSelection9.CheckedChanged,
radSelection10.CheckedChanged

btnSubmit.Enabled = True

score = CByte(CType(sender, RadioButton).ID.Substring(12))

End Sub


As you can see, Rating_CheckedChanged is (supposedly) called by 10 different
RadioButton's CheckedChanged events. However, when I ran the debugger this
process was never called. I would think it would be called whenever the user
selected a different RadioButton (since radSelection1-radSelection10 all
have the same GroupName). Since the RadioButtons and Handles clause are
always there in my code (they are not dynamically added anymore), what could
be the problem? Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top