Manipulating a User Control from another User Control

Discussion in 'ASP .Net' started by Tom Rowton, Aug 1, 2003.

  1. Tom Rowton

    Tom Rowton Guest

    This one has me a bit confused and I'm not finding what I
    need in the MSDN or by searching these forums, so here
    goes...


    I have a rather large, complex code-in-page WebForm
    (don't ask) and a section of that Form is 4 or 5
    ASP:panels pretending to be a set of Tabs, each with its
    own section of the form.

    In order to simplify managing this page, since code-
    behind is not an option (don't ask, not my fault), I
    thought I had the solution...

    I would convert each Panel into a User Control.
    The problem is that the panels usually depend on at least
    one Form Control from at least one other Panel.

    I already know about RaiseBubbleEvent() and OnBubbleEvent
    () and have used them elsewhere, but they only work going
    UP the container heirarchy.

    I need to :
    1 - (partially) handle an event in the UserControls
    (panels), then (partially handle the same event in
    ANOTHER UserControl(panel) on the same form/page.

    2 - handle an event in a UserControl(panel) BUT be able
    to retrieve values from form fields(Controls) in OTHER
    UserControls(panels) to help determine how to handle the
    event.

    3 - (partially) handle an event in the Form(aspx)
    depending on values of form controls in the UserControls

    4 - manipulate values of form controls in the
    UserControls


    Like I said, I already know how to Bubble events, but
    that only goes up.
    The part I am missing is how to "Elbbub" events (bubble,
    backwards) or manipulate data in child objects.

    The trick is, this is all Code-in-Page and nothing will
    convince those in control to return to Code Behind.

    Anyone know how to do what I want/need to do?

    I have a set of aspx/ascx pages that I can email or ftp
    for anyone interested.
    Tom Rowton, Aug 1, 2003
    #1
    1. Advertising

  2. Okay, let me see if I understand you correctly. You've got an Event Handler
    for one UserControl that needs to do something with another UserControl,
    right? It looks to me like your error is in using Page.FindControl(...). The
    FindControl() method of a Control looks for controls in that Control's
    Controls Collection (was that a confusing sentence or what?). Your
    UserControls are not in the Page's Controls Collection; they are in your
    Form's Controls collection. Does that help?

    --
    HTH,

    Kevin Spencer
    Microsoft MVP
    ..Net Developer
    http://www.takempis.com
    Complex things are made up of
    lots of simple things.

    "Tom Rowton" <> wrote in message
    news:6bd801c3585b$7613c060$...
    > Ok, I hope this works. I'll just post entire files, and
    > separate them by a line of dashes.
    > MyCaseSub.ascx was trying to get the value of
    > MyCaseMain.ascx's label, but it wouldn't work. I could
    > get the ID of the Case:MainPanel usercontrol, but I can't
    > access the Property Method _UNLESS_ I bubble the event to
    > MyCase.aspx and let MyCase.aspx call the Get.
    >
    > Clearly, this is a matter of not understanding the object
    > model, but I can't seem to find anyone to tell me how to
    > do it without Bubbling, or I'm asking in an unclear
    > manner.
    >
    > TIA,
    > Tom
    >
    > MyCase.aspx
    > ------------------------
    > <%@ Register TagPrefix="Case" TagName="MainPanel"
    > Src="MyCaseMain.ascx" %>
    > <%@ Register TagPrefix="Case" TagName="SubPanel"
    > Src="MyCaseSub.ascx" %>
    > <%@ Register TagPrefix="Case" TagName="SubPanel2"
    > Src="MyCaseSub2.ascx" %>
    > <%@ Import Namespace = "System.Web.UI.WebControls" %>
    > <%@ Import Namespace = "System.Data.SqlTypes" %>
    > <%@ Import Namespace = "System.Data.SqlClient" %>
    > <%@ Import Namespace = "System.Drawing" %>
    > <%@ Import Namespace = "System.Data" %>
    > <%@ Import Namespace = "System.Web" %>
    > <%@ Import Namespace = "System" %>
    > <%@ Page Language="vb" Inherits="System.Web.UI.Page" %>
    > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
    > Transitional//EN">
    > <HTML>
    > <HEAD>
    > <title>User Controls Test Page</title>
    > <script language="VB" runat="server">
    >
    > Protected Overrides Function OnBubbleEvent(ByVal
    > source As Object, ByVal args As System.EventArgs) As
    > Boolean
    > If source.GetType.Equals (GetType
    > (Button)) Then
    > Dim oButton As Button = source
    > Select Case oButton.ID
    > Case "btnMainButton"
    > 'Change text of
    > Subsection Label
    >
    > SubPanel1.SubLabelValue = "Changed by Main Panel
    > via RaiseBubbleEvent()"
    > Case "btnSubButton"
    > 'Change text of
    > Main Label
    >
    > MainPanel1.MainLabelValue = "Changed by Sub Panel
    > via RaiseBubbleEvent()"
    > Case "btnGetMain"
    > dim temp as
    > string = MainPanel1.MainLabelValue
    >
    > SubPanel1.lblParentValue = temp
    > Case "btnSub2Button"
    > 'Change text of
    > Main Label and Subsection Label
    >
    > SubPanel1.SubLabelValue = "**Changed by Sub2
    > Panel via RaiseBubbleEvent()**"
    >
    > MainPanel1.MainLabelValue = "**Changed by Sub2
    > Panel via RaiseBubbleEvent()**"
    > End Select
    > End If
    > End Function
    >
    > sub btnReset_Click(sender as Object, e as
    > EventArgs)
    > SubPanel1.SubLabelValue = "Sub Panel"
    > SubPanelB1.Sub2LabelValue = "Sub2 Panel"
    > MainPanel1.MainLabelValue = "Main Panel"
    > end sub
    >
    > Sub CaseTabBtn_Click(sender As Object, e As
    > System.EventArgs)
    > ' CasePanel.Visible = True
    > ' AssignmentPanel.Visible = False
    > end sub
    > Sub AssignmentTabBtn_Click(sender As Object, e As
    > System.EventArgs)
    > ' CasePanel.Visible = False
    > ' AssignmentPanel.Visible = True
    > end sub
    > sub page_load(sender As Object, e As System.EventArgs)
    > if not page.ispostback
    > end if
    > end sub
    > </script>
    > <META content="True" name="vs_showGrid">
    > <META content="Microsoft Visual
    > Studio.NET 7.0" name="GENERATOR">
    > <META content="Visual Basic 7.0"
    > name="CODE_LANGUAGE">
    > <META content="JavaScript"
    > name="vs_defaultClientScript">
    > <META
    > content="http://schemas.microsoft.com/intellisense/ie5"
    > name="vs_targetSchema">
    > </HEAD>
    > <body runat=server>
    > <FORM id="Form1" method="post"
    > encType="multipart/form-data" runat="server">
    > <asp:literal id="litScript"
    > runat="server" EnableViewState="False"></asp:literal>
    > <asp:panel id="MainPanel"
    > runat="server" borderwidth="1" borderstyle="ridge"
    > backcolor="PaleGoldenrod" HorizontalAlign="Center">&nbsp;
    > <CASE:MainPanel
    > id="MainPanel1" runat="server"
    > NAME="MainPanel1"></CASE:MainPanel>
    > </asp:panel>
    > <P></P>
    >
    > <asp:linkbutton id="CaseTabBtn"
    > onclick="CaseTabBtn_Click" runat="server"
    > BackColor="White" BorderWidth="1"
    > BorderColor="Goldenrod">Case</asp:linkbutton>&nbsp;&nbsp;
    > <asp:linkbutton
    > id="AssignmentTabBtn" onclick="AssignmentTabBtn_Click"
    > runat="server" BackColor="White" BorderWidth="1"
    > BorderColor="Goldenrod">Assignment</asp:linkbutton>&nbsp;&
    > nbsp;
    >
    > <asp:panel id="CasePanel"
    > runat="server" borderwidth="1" borderstyle="ridge"
    > backcolor="PaleGoldenrod" HorizontalAlign="Center">&nbsp;
    > <CASE:SubPanel
    > id="SubPanel1" runat="server"
    > NAME="SubPanel1"></CASE:SubPanel>
    > </asp:panel>
    >
    > <asp:panel id="AssignmentPanel"
    > runat="server" borderwidth="1" borderstyle="ridge"
    > backcolor="PaleGoldenrod" HorizontalAlign="Center">&nbsp;
    > <CASE:SubPanel2
    > id="SubPanelB1" runat="server"
    > NAME="SubPanelB1"></CASE:SubPanel2>
    > </asp:panel>
    > <asp:button id="btnReset"
    > onclick="btnReset_Click" runat="server" Text="Reset all
    > Panels"></asp:button>
    > </FORM>
    > </BODY>
    > </HTML>
    >
    > ----------------------
    > MyCaseMain.ascx
    > ----------------------
    > <%@ Control Language="vb" AutoEventWireup="false"
    > Inherits="System.Web.UI.UserControl"%>
    > <%@ Import Namespace = "System.Web.UI.WebControls" %>
    > <%@ Import Namespace = "System.Data.SqlClient" %>
    > <%@ Import Namespace = "System.Drawing" %>
    > <%@ Import Namespace = "System.Data" %>
    > <%@ Import Namespace = "System.Web" %>
    > <%@ Import Namespace = "System" %>
    > <script language="VB" runat="server">
    > Property MainLabelValue() as String
    > Get
    > Return lblMainLabel.Text
    > end Get
    > Set
    > lblMainLabel.Text = value
    > end Set
    > end Property
    > sub btnMainButton_Click(sender as Object, e as
    > EventArgs)
    > RaiseBubbleEvent(sender, e)
    > end sub
    > </script>
    > <hr>
    > Main Section<BR>
    > <asp:Label id="lblMainLabel" runat="server"
    > Visible="True">Main Label(MyCaseMain.ASCX)
    > </asp:Label><BR><BR>
    > <asp:button id="btnMainButton"
    > onclick="btnMainButton_Click" runat="server" Text="Change
    > Subsection Panel"></asp:button>
    > <hr>
    >
    > -----------------
    > MyCaseSub.ascx
    > -----------------
    >
    > <%@ Control Language="vb" AutoEventWireup="false" %>
    > <%@ Import Namespace = "System.Web.UI.WebControls" %>
    > <%@ Import Namespace = "System.Data.SqlClient" %>
    > <%@ Import Namespace = "System.Drawing" %>
    > <%@ Import Namespace = "System.Data" %>
    > <%@ Import Namespace = "System.Web" %>
    > <%@ Import Namespace = "System" %>
    > <script language="VB" runat="server">
    > Property SubLabelValue() as String
    > Get
    > Return lblSubLabel.Text
    > end Get
    > Set
    > lblSubLabel.Text = value
    > end Set
    > end Property
    > Property lblParentValue() as String
    > Get
    > Return lblParent.Text
    > end Get
    > Set
    > lblParent.Text = value
    > end Set
    > end Property
    > sub btnSubButton_Click(sender as Object, e as
    > EventArgs)
    > RaiseBubbleEvent(sender, e)
    > end sub
    > sub btnGetMain_Click(sender as Object, e as
    > EventArgs)
    > RaiseBubbleEvent (sender, e)
    > ' Dim MyControl as Control =
    > Page.FindControl("MainPanel1")
    > ' if (not MyControl is Nothing) then
    > ' lblParent.Text =
    > MyControl.MainLabelValue()
    > ' else
    > ' lblParent.Text = "MainPanel1 not
    > found"
    > ' end if
    > end sub
    > </script>
    > <hr>
    > Sub Section<BR>
    > <asp:Label id="lblSubLabel" runat="server"
    > Visible="True">Sub Label(MyCaseSub.ASCX)</asp:Label><BR>
    > Main Panel's ID:<asp:Label id="lblParent"
    > runat="server" Visible="True"></asp:Label><BR>
    > <asp:button id="btnSubButton"
    > onclick="btnSubButton_Click" runat="server" Text="Change
    > Main section Panel"></asp:button>
    > <asp:button id="btnGetMain"
    > onclick="btnGetMain_Click" runat="server" Text="Get Main
    > Panel label"></asp:button>
    > <hr>
    >
    > --------------
    Kevin Spencer, Aug 1, 2003
    #2
    1. Advertising

  3. Tom Rowton

    Tom Rowton Guest

    >Form's Controls collection. Does that help?
    It's good info to have, but doesn't really fix my
    problem.

    in MyCaseSub.ascx where I have commented out
    ---------------------------------------------
    Dim MyControl as Control =
    Page.FindControl("MainPanel1")
    if (not MyControl is Nothing) then
    lblParent.Text =
    MyControl.MainLabelValue()
    else
    lblParent.Text = "MainPanel1 not
    found"
    end if
    ------------------------------------------------

    The "else" never happens.
    MyControl is _never_ Nothing.
    I can print the ID out just fine.
    But I am unable to access the "MainLabelValue()" Property
    GET - which works just fine from the bubbled event in
    MyCase.aspx.

    To sum up, I know that Page.FindControl() finds the
    usercontrol, because I can print out the ID I've given it
    in the HTML, but I cannot access the Property I've given
    in the script block of the UserControl.

    Or did I just misunderstand your point?
    Tom Rowton, Aug 1, 2003
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Søren M. Olesen
    Replies:
    0
    Views:
    560
    Søren M. Olesen
    Nov 13, 2003
  2. qwerty
    Replies:
    3
    Views:
    9,262
    Scott Allen
    Sep 30, 2004
  3. agent349

    Manipulating user input

    agent349, Apr 9, 2004, in forum: C++
    Replies:
    6
    Views:
    501
    Kevin Goodsell
    Apr 9, 2004
  4. Replies:
    6
    Views:
    981
  5. gg77

    Need help manipulating a table control

    gg77, Aug 16, 2005, in forum: ASP .Net Web Controls
    Replies:
    0
    Views:
    97
Loading...

Share This Page