Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / General / June 2007

Tip: Looking for answers? Try searching our database.

Puzzling behaviour for dynamically added command buttons....

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Radu - 08 Jun 2007 15:56 GMT
Hi. I have a page with the following html:

__________________________________________________________
<h1>Dynamic Controls Test</h1>
<hr />
<asp:TextBox ID="txtProduct1" Text="txtProduct 1" runat="server"></
asp:TextBox>
<asp:Button ID="cmdAddRow" Text="+" AccessKey="+" runat="server" />
<asp:Button ID="cmdSubtractRow" Text="-" AccessKey="+" runat="server" /

<asp:PlaceHolder runat="server" id="placeTextBoxes" />
<hr />
<asp:Button ID="cmdPostback" Text="Postback !" runat="server" />
<br />
<asp:label runat="server" id="lblControlList" />
__________________________________________________________

and the code

__________________________________________________________
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        'Initial load...
        ViewState("FieldCount") = 1
    End If
    DrawAllRows()
End Sub

Protected Sub cmdAddRow_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdAddRow.Click

    ViewState("FieldCount") += 1
    placeTextBoxes.Controls.Clear()
    DrawAllRows()
End Sub

Protected Sub cmdSubtractRow_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdSubtractRow.Click

    ViewState("FieldCount") -= 1
    placeTextBoxes.Controls.Clear()
    DrawAllRows()
End Sub

Protected Sub cmdPostback_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles cmdPostback.Click

    lblControlList.Text = ListAllControls(Page)
End Sub

Private Sub DrawAllRows()

    Dim intCounter As Integer
    Dim intMaxCount As Integer

    intMaxCount = CInt(ViewState("FieldCount"))
    If intMaxCount > 1 Then
        For intCounter = 2 To intMaxCount
            AddRowOfControls(intCounter)
        Next
    End If
    lblControlList.Text = ListAllControls(Page)
End Sub

Private Sub AddRowOfControls(ByVal intRowCount As Integer)

    Dim litLabel As LiteralControl
    Dim txtTextBox As TextBox
    Dim cmdAddRow As Button
    Dim cmdSubtractRow As Button

    litLabel = New LiteralControl
    litLabel.Text = "<br>"
    placeTextBoxes.Controls.Add(litLabel)

    txtTextBox = New TextBox
    txtTextBox.Text = "txtProduct " & intRowCount.ToString
    placeTextBoxes.Controls.Add(txtTextBox)

    cmdAddRow = New Button
    cmdAddRow.Text = "+"
    AddHandler cmdAddRow.Click, AddressOf cmdAddRow_Click
    placeTextBoxes.Controls.Add(cmdAddRow)

    cmdSubtractRow = New Button
    cmdSubtractRow.Text = "-"
    AddHandler cmdSubtractRow.Click, AddressOf cmdSubtractRow_Click
    placeTextBoxes.Controls.Add(cmdSubtractRow)
End Sub

Private Function ListAllControls(ByVal objContainter As Control) As
String

    Dim strBuilder As New StringBuilder
    Dim ctlText As TextBox

    For Each ctl As Control In objContainter.Controls
        If ctl.Controls.Count > 0 Then
            strBuilder.Append(ListAllControls(ctl))
        Else
            If TypeOf ctl Is TextBox Then
                ctlText = CType(ctl, TextBox)
                strBuilder.Append("<br>")
                strBuilder.Append(ctlText.Text)
            End If
        End If
    Next

    If Not ctlText Is Nothing Then
        ctlText.Dispose()
    End If

    Return strBuilder.ToString
End Function
__________________________________________________________

What could be simpler ? And still.... If I click only the + and the -
buttons which have NOT been created dynamically, everything is just
fine. However, if I click on the newly created buttons, let's say on
the + button, I need TWO clicks - one changes the text in the last
textbox from, say, "txtProduct 5" to "txtProduct 2", and the second
click finally adds a new row and now everything is correct - it adds
"txtProduct 6" and I obtain the list of controls as follows:

txtProduct 1
txtProduct 2
txtProduct 3
txtProduct 4
txtProduct 5
txtProduct 6

What's wrong with this approach ? I'm obviously missing something ! ;-
((

Thank you very much.
Alex
Yuriy Solodkyy - 08 Jun 2007 17:14 GMT
Hi

That is because ommand buttons clicks are invoked by control ID.  When you
recreate controls while handling click event, you create new controls with
new IDs. However, next time on postback the same controls are created with
different IDs.  Therefore, if page was generated with recreating controls
command buttons IDs are different.

Try assigning unique IDs to your controls and try not recreating already
existing controls.  I.e if you add new line of controls just add it without
clearing existing.  

To see your problem replace

               strBuilder.Append(ctlText.Text)

with
               strBuilder.Append(ctlText.Text + " " + ctlText.UniqueID)

And see how IDs chnage.

yuriy

> Hi. I have a page with the following html:
>
[quoted text clipped - 117 lines]
> Thank you very much.
> Alex
Radu - 08 Jun 2007 18:14 GMT
> Hi
>
[quoted text clipped - 142 lines]
>
> - Show quoted text -

Thank you, thank you, thank you !!!
That was it - it works like a charm now.
Did I say Thank you ? :-)))
Alex

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.