Button-click fire before or after page_load?

M

Mark

Hi - thanks for the help in this group so far.

Regarding the click event of a link_button (created within a table and
added to a placeholder at run-time) - there are a number of link_buttons
added to the dyanmic table I am using (a gantt chart) - when you click
on one of the link_buttons, it calls a sub which takes the reference of
the table cell (a persons name, and the date - it's a resource chart) -
and updates the DB with a 'booked' flag for that person for that date.

However, if I redraw the table and link_buttons at the end of this
update routine, the changes do not show until a subsequent post_back has
been made - in effect, it looks like the updating is one click behind
me.

If I redraw the table from the page_load too (following Alessandro's
post), it works, but only if I have also called the redraw from the
update sub above (effectively doubling teh load on the app, and the
calls to the database). If I don't call the redraw from both the sub,
and the page_load - it doesn't work as soon as I click the link_button.

Have I missed something here?

Thanks,
 
A

Alessandro Zifiglio

Mark, on that same old article you will notice that i have addressed this
issue too. The reason you are seeing this retardation behavior is because
you are recreating the controls in two different places and this can mess up
the events because after a postback round trip the event information, who
posted back and who should handle the event is passed back to the page.
Suppying an explicit ID to your dynamically created controls assures that
the approriate event handlers receive this information. Follow that post
again, i think you missed this part.

http://groups.google.com/groups?hl=...re&ie=UTF-8&oe=UTF-8&hl=en&btnG=Google+Search
 
M

Mark

I think what I'm asking is how do I update the database in the
link_button click, redraw the control, without having to wait for a
subsequent post_back to 'catch up'.

Thanks again,
 
M

Mark

Hi Alessandro - thanks again - I went back to the article, and reread it
- I had named a couple of things incorrectly, which I think I've
resolved - but I still appear to be calling the display twice - once at
postback, and once for the link_button click. The code below loops 10
times, and reads a database table - but that part isn't important - it's
the calling it twice I just can't get right. I'd appreciate if you
could look over the code if you have time, to see where I've misread
your original posting... sorry I'm taking so much of your time - but I
really do appreciate your guidance.

In aspx:

<asp:placeHolder id="PlaceHolder1" runat="server"
EnableViewState="False"></asp:placeHolder>

In codebehind:


Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
Response.Write("<br>page_load at " & DateTime.Now)
If IsPostBack Then
If Not viewstate("controls") Is Nothing Then
Response.Write("<br>calling from page_load at " &
DateTime.Now)
doDateArray()
'End If
End If
End If
Response.Write("<br>page_end at " & DateTime.Now)
End Sub



Sub doDateArray()
Dim sDate As DateTime
Dim x As Integer
Dim myDateArr As ArrayList
sDate = "2004-04-02"
myDateArr = New ArrayList
For x = 0 To 31
myDateArr.Add(sDate.AddDays(x).ToShortDateString.ToString)
Next
x = myDateArr.Count
Dim mystring As String
Dim mt_ConvDate As String
Dim bookingexists As Integer
Dim Table1 As New Table
Dim i As Integer
Dim mtr As New TableRow
Dim mtcresourcename2 As New TableCell
mtcresourcename2.Controls.Add(New LiteralControl("resource"))
mtr.Cells.Add(mtcresourcename2)
For i = 0 To x - 1
Dim mtc As New TableCell
Select Case CDate(myDateArr(i)).DayOfWeek
Case DayOfWeek.Saturday, DayOfWeek.Sunday
mtc.Controls.Add(New
LiteralControl(CDate(myDateArr(i)).Day))
Case Else
mtc.Controls.Add(New
LiteralControl(CDate(myDateArr(i)).Day))
End Select
mtc.Width = Unit.Pixel(22)
mtr.Cells.Add(mtc)
mtc.ID = "mtc" & i.ToString
Next
Table1.Rows.Add(mtr)
mtr.ID = "mtrr"
Dim resource_id As Integer
Dim resource_name As String
Dim a As Integer
Dim j As Integer
j = 0
For a = 0 To 10
resource_id = a.ToString
resource_name = a.ToString & "- name"
Dim mtr2 As New TableRow
j = j + 1
Dim mtcresourcename As New TableCell
mtcresourcename.Controls.Add(New LiteralControl("<div
style='background-color:Blue;color:white;'>" & resource_name &
"</div>"))
mtr2.Cells.Add(mtcresourcename)
For i = 0 To x - 1
Dim mtc2 As New TableCell
'mt_ConvDate = mt_date(myDateArr(i))
Dim exists As Integer
exists = 0
exists = checkexist("mtc2i" & i.ToString & "_" &
j.ToString)
Response.Write("<br>checking:" & "mtc2i" & i.ToString &
"_" & j.ToString)
If exists > 1 Then
mtc2.Controls.Add(New LiteralControl("<div
style='background-color:limegreen;color:white;'>&nbsp;</div>"))
Else
Dim objBtn As New LinkButton
objBtn.ID = "btnID" & resource_id.ToString & "_" &
i.ToString
objBtn.EnableViewState = False
objBtn.CausesValidation = False
objBtn.Text = "-"
AddHandler objBtn.Click, AddressOf btnClicked
mtc2.Controls.Add(objBtn)
mtc2.BackColor = System.Drawing.Color.White
mtc2.HorizontalAlign = HorizontalAlign.Center
mtc2.VerticalAlign = VerticalAlign.Middle
End If
mtr2.Cells.Add(mtc2)
mtc2.ID = "mtc2i" & i.ToString & "_" & j.ToString
Next
Table1.Rows.Add(mtr2)
Next
PlaceHolder1.Controls.Add(Table1)
Table1.ID = "mycontrol1"
viewstate("controls") = 1

End Sub

Sub btnClicked(ByVal obj As Object, ByVal e As EventArgs)
PlaceHolder1.Controls.Clear()
Response.Write("<br>button clicked at " & DateTime.Now)
doDateArray()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
doDateArray()
End Sub

Function checkexist(ByVal text As String) As Integer
Dim strConn As String =
ConfigurationSettings.AppSettings("conString")
Dim myoledb As String = "SELECT id, text FROM table1 WHERE
text=@text"
Dim myConn As New OleDbConnection(strConn)
Dim objDR As OleDbDataReader
Dim cmd As New OleDbCommand(myoledb, myConn)
cmd.Parameters.Add(New OleDbParameter("@text", "" & text))
myConn.Open()
objDR = cmd.ExecuteReader(CommandBehavior.CloseConnection)
If objDR.Read Then
checkexist = 1
End If
myConn.Close()
End Function
 
A

Alessandro Zifiglio

Mark, can you resolve by having an additional check in your buttonclick.
Page load is always fired before your button click event handler and
executes your code, adding your dynamic controls. And then this is
re-executed in the click event handler of the button for the second time.
You are seeing doubled data because of this. Also if you will notice, when
clicking one of your dynamically created link buttons you will see that you
dont receive double data because you are clearing the placeholders controls
collection here. This is fine if you want to re-execute the code and are
loading different data. On the other hand in your static button click event
you are not clearing the placeholder and I guess you dont want to re-execute
here. On the older post i had made this worked fine because that user was
loading different controls as well after postback. So clearing the
placeholders controls collection and recreating the controls at this point
was not very inefficient and required this step. This does not seem
to be your case. So why not check in your button if the viewstate flag is
set and if so dont let it re-run the code as this has already been executed
on page_load.


Private Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.Click
If viewstate("controls") Is Nothing Then
doDateArray()
End If
End Sub
 
M

Mark

Hi Alessandro - thanks again - that does stop it executing twice, but
the code needs to execute the buttonclick, and then redraw - I plan to
have the buttonclick event add an entry to the database, which will
'block off' that resources time for that day (the cell clicked). So by
not redrawing at the buttonclick stage, my controls display will always
appear to be one step behind (as it won't be redrawn with the updated
database checks until the next postback).

Is this just something I have to live with, or have my code execute the
redraw twice? (I'm getting there with your help - but slowly:)!)
 
A

Alessandro Zifiglio

I'm unable to follow.
There is no retardation of events. I have tested and the code in your
button1 click fires correctly. The code in your btnClick event fires
correctly as soon as a link button is clicked and your doDateArray sub
routine is re-executed.

The only undesired effect was the part where you had your data doubled when
your doDateArray sub routine got re-executed again your button1 click. You
can resolve this by clearing your placeholder here, or checking against the
viewstate flag. Thats about it mark. It has to be working. I have executed
your code in debug mode and watched it run line by line ;P

If you still feel that i have missed your point try and describe exactly
what parts are not working for you. Try and replicate in a very simple
sample showcasing the part that is not working.

For any of your events to fire, that is events of your dynamic
controls --like your linkbuttons, the code in your doDateArray sub routine
has to be re-executed and all those controls including the linkbuttons have
to get recreated which is what your doDateArray sub routine is doing, only
then does it maintainstate and finally rem "oh, linkbutton_bla got click,
lets go and wire it up to the appropriate handler and handle the event" . .
..etc
 
A

Alessandro Zifiglio

Wish i could help Mark. Your on your own there. Not sure if anybody else can
help either. I can only assure you that its very awkward to have the event
you want fired being one click behind always. Your going to have to debug
this and find the bug.
 

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

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top