m_********@yahoo.com.au wrote in
news:11*********************@f14g2000cwb.googlegro ups.com:
Hi everyone,
I'm neck deep in ASP.NET and sinking fast ;) Any help much
appreciated.
I have two user controls on a page that I want to communicate
with each other. One control is called RoleList and allows the
user to select the type of view they wish to see on the page.
The other control(s) - sometimes there may be several - then
change the stored proc, query etc they use to extract info from
sql.
Therefore, I have set up the RoleList to generate an event and
coded the other control(s) to listen and recieve it.
The problem is timing. I've done some tracing to see what
happens and when:
1 aspx.page Begin Init
2 aspx.page End Init
3 aspx.page Begin LoadViewState
4 aspx.page End LoadViewState
5 aspx.page Begin ProcessPostData
6 aspx.page End ProcessPostData
7 Control ID: RoleList - role was previously set in the
viewstate: tutor
8 Control ID: StudentList - role was previously set in the
viewstate: tutor
9 aspx.page Begin ProcessPostData Second Try
10 aspx.page End ProcessPostData Second Try
11 aspx.page Begin Raise ChangedEvents
12 aspx.page End Raise ChangedEvents
13 aspx.page Begin Raise PostBackEvent
14 Changing role to: Secretary
15 Control ID: RoleList - changed role to: Secretary
16 Control ID: StudentList - changed role to: Secretary
17 aspx.page End Raise PostBackEvent
18 aspx.page Begin PreRender
19 aspx.page End PreRender
20 aspx.page Begin SaveViewState
21 aspx.page End SaveViewState
22 aspx.page Begin Render
23 aspx.page End Render
Line 7 and 8 came from the page_load event in each control.
Line 14 came from the event being fired and the next two is
where the event is caught.
But the Load event (which contains the data binding for the list
/ grids etc) for the response has already happened! Therefore
the user must click the role they want to see TWICE!!!
I could probably make some public properties in the base page
and read/write info from them to get around this. But this will
mess up my otherwise quite low coupling and I don't want to.
Mark,
It looks like you need to conditionally perform the databinding in
two places: the page (or control) load event, and the RoleList
Changed event.
In the page/control Load event, only perform the databinding if the
page has not been posted back. If the page has been posted back,
another event handler is going to be responsible for the databinding
(RoleList Changed, in this case).
In the RoleList Changed event, iterate through all of the controls on
the page, and send a message to all of the StudentList controls.
foreach (Control ctrl in this.Controls)
{
if (ctrl is StudentList)
(ctrl as StudentList).SendAMessage("new role value goes here");
}
--
Hope this helps.
Chris.
-------------
C.R. Timmons Consulting, Inc.
http://www.crtimmonsinc.com/