PDA

View Full Version : dynamic buttons, listbox on postback problem


fresh2000
07-03-2006, 02:27 PM
I really need some serious help here because this one is driving me nuts. See code below. I just don't get it.

I would assume, because I create my dynamic buttons in the on page load, it would recreate the listboxes after every postback, in this case after the click event of extrastoevoegen or extrasverwijderen ??? At this moment it only works when I click a button twice... or use reponse.redirect to the same page in the click event of extrastoevoegen or extrasverwijderen to make sure it realy reloads again. I don't want that because I need to maintain the scrollposition...

Imports System.Data
Imports System.Data.SqlClient
Partial Class test
Inherits System.Web.UI.Page
Public bID As String
Sub Page_Load(ByVal s As Object, ByVal e As EventArgs) Handles Me.Load
Session("boekingID") = 105
travelers()
End Sub
Sub travelers()
Dim ConnStr As String = System.Configuration.ConfigurationManager.AppSettings("MyProvider")
Dim Sql As String = "SELECT some fields"
Dim conn As New SqlConnection(ConnStr)
Dim objDR As SqlDataReader
Dim Cmd As New SqlCommand(Sql, conn)
conn.Open()
objDR = Cmd.ExecuteReader()
While objDR.Read()
Dim l As Integer
bID = objDR.Item("boekerID")
extras()
l = l + 1
End While
objDR.Close()
conn.Close()
End Sub
Sub extras()
'aanmaken extra's en de buttons
Dim conn As New SqlConnection(System.Configuration.ConfigurationManager.AppSettings("MyProvider"))
conn.Open()
'ongeboekte extras per reiziger
Dim get_boeker_ongeboekte_extras As New SqlCommand("get_boeker_ongeboekte_extras", conn)
get_boeker_ongeboekte_extras.CommandType = CommandType.StoredProcedure
get_boeker_ongeboekte_extras.Parameters.AddWithValue("@boekerID", bID)
get_boeker_ongeboekte_extras.Parameters.AddWithValue("@boekingID", Session("boekingID"))
Dim rdr_get_boeker_ongeboekte_extras As SqlDataReader = get_boeker_ongeboekte_extras.ExecuteReader()

Dim extras As New ListBox
extras.ID = "lbx_extras" & bID
extras.DataSource = rdr_get_boeker_ongeboekte_extras
extras.DataValueField = "extraID"
extras.DataTextField = "naam"
extras.DataBind()
rdr_get_boeker_ongeboekte_extras.Close()

'geboekte extras
Dim get_boeker_geboekte_extras As New SqlCommand("get_boeker_geboekte_extras", conn)
get_boeker_geboekte_extras.CommandType = CommandType.StoredProcedure
get_boeker_geboekte_extras.Parameters.AddWithValue("@boekingID", Session("boekingID"))
get_boeker_geboekte_extras.Parameters.AddWithValue("@boekerID", bID)
Dim rdr_get_boeker_geboekte_extras As SqlDataReader = get_boeker_geboekte_extras.ExecuteReader()

Dim gekozenextras As New ListBox
gekozenextras.ID = "lbx_gekozenextras" & bID
gekozenextras.DataSource = rdr_get_boeker_geboekte_extras
gekozenextras.DataValueField = "extraID"
gekozenextras.DataTextField = "naam"
gekozenextras.DataBind()
rdr_get_boeker_geboekte_extras.Close()

'knopje voor toevoegen
Dim extrastoevoegen As New Button
extrastoevoegen.CssClass = "btn"
extrastoevoegen.Text = "-->"
extrastoevoegen.CommandName = "myId"
extrastoevoegen.CommandArgument = bID
AddHandler extrastoevoegen.Command, AddressOf extrastoevoegen_Click

'knopje voor verwijderen
Dim extrasverwijderen As New Button
extrasverwijderen.CssClass = "btn"
extrasverwijderen.Text = "<--"
extrasverwijderen.CommandName = "myId"
extrasverwijderen.CommandArgument = bID
AddHandler extrasverwijderen.Command, AddressOf extrasverwijderen_Click

plh_reizigers.Controls.Add(extras)
plh_reizigers.Controls.Add(extrastoevoegen)
plh_reizigers.Controls.Add(extrasverwijderen)
plh_reizigers.Controls.Add(gekozenextras)
conn.Close()
End Sub



Sub extrastoevoegen_Click(ByVal Sender As Object, ByVal e As CommandEventArgs)
Dim extrastoevoegen As Button = CType(Sender, Button)
Dim myId As String = extrastoevoegen.CommandArgument
Dim lbx As ListBox = FindControl("lbx_extras" & myId)
Dim conn As New SqlConnection(System.Configuration.ConfigurationManager.AppSettings("MyProvider"))
conn.Open()
Dim set_boeker_extra As New SqlCommand("set_boeker_extra", conn)
set_boeker_extra.CommandType = CommandType.StoredProcedure
set_boeker_extra.Parameters.AddWithValue("@boekingID", Session("boekingID"))
set_boeker_extra.Parameters.AddWithValue("@extraID", lbx.SelectedValue)
set_boeker_extra.Parameters.AddWithValue("@boekerID", myId)
set_boeker_extra.ExecuteNonQuery()
conn.Close()
lbx.SelectedIndex = -1
'Response.Redirect("dynamic.aspx")
End Sub



Sub extrasverwijderen_Click(ByVal Sender As Object, ByVal e As CommandEventArgs)
Dim extrasverwijderen As Button = CType(Sender, Button)
Dim myId As String = extrasverwijderen.CommandArgument
Dim lbx As ListBox = FindControl("lbx_gekozenextras" & myId)
Dim conn As New SqlConnection(System.Configuration.ConfigurationManager.AppSettings("MyProvider"))
conn.Open()
Dim del_boeker_extra As New SqlCommand("del_boeker_extra", conn)
del_boeker_extra.CommandType = CommandType.StoredProcedure
del_boeker_extra.Parameters.AddWithValue("@boekingID", Session("boekingID"))
del_boeker_extra.Parameters.AddWithValue("@extraID", lbx.SelectedValue)
del_boeker_extra.Parameters.AddWithValue("@boekerID", myId)
del_boeker_extra.ExecuteNonQuery()
conn.Close()
lbx.SelectedIndex = -1
'Response.Redirect("dynamic.aspx")
End Sub
End Class

komila_it2001
07-06-2006, 12:02 PM
hi
by ur such a lengthy code i don understand wat is ur problem.
but as i understand by ur write up is on every click of ur button in ur list box the items ar getting repeated..
is it so???

if yes then just mention
if not page.ispostback then
............. ur code of filling item in list box.
end if...
thats it.

fresh2000
07-06-2006, 12:49 PM
The problem is that when I click one dynamically added button, I have to click it twice for the event to take place.

otaku149
07-06-2006, 12:56 PM
The best place to create dynamic controls is in the Page_Init, that way viewState will be automatically reloaded and event handlers will work as expected:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
'create your dynamic controls here
End Sub

fresh2000
07-06-2006, 01:09 PM
I know it is well meant but sorry... I have been on this problem for 5 days and have searched 20 layers deep in google... trust me when I say that I have tried to load the controls in the init... and another 100 options.



The best place to create dynamic controls is in the Page_Init, that way viewState will be automatically reloaded and event handlers will work as expected:

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
'create your dynamic controls here
End Sub