Results 1 to 9 of 9

Thread: usercontrol - communicatieprobleem

  1. #1

    usercontrol - communicatieprobleem

    Ik heb een webpagina met daarop een treeview en een aantal usercontrols. Een specifieke handeling in die treeview zorgt voor een postback maar moet ook de selected node doorgeven aan de usercontrols.
    Probleem is dat de usercontrols een postback achterliggen op de treeview omdat - zo blijkt - de usercontrols geladen worden voordat het betreffende treeview event wordt uitgevoerd.
    Ik geef de selected node door via de sessie.

    Hoe kan ik dit oplossen? Moet er communicatie gebeuren via interfaces of is er een andere manier waarop dit probleem opgelost kan worden.

  2. #2
    Je kunt dat inderdaad met interfaces oplossen door je pagina een interface te laten ondersteunen. In je Page_Load kun je deze interface vervolgens uit je Context.Handler halen. Met zo'n interface kun je dan alle gewenste informatie uit je aanroepende pagina halen.

    Dus stel je hebt de volgende interface:

    Code:
      ITest = interface
        function GetClickText: string;
        property ClickText: string read GetClickText;
      end;
    Deze pagina ondersteund deze interface:

    Code:
      TWebForm1 = class(System.Web.UI.Page, ITest)
      {$REGION 'Designer Managed Code'}
      strict private
        procedure InitializeComponent;
        procedure Button1_Click(sender: System.Object; e: System.EventArgs);
        procedure Button2_Click(sender: System.Object; e: System.EventArgs);
      {$ENDREGION}
      strict private
        FClickText: string;
        procedure Page_Load(sender: System.Object; e: System.EventArgs);
      strict protected
        Button1: System.Web.UI.WebControls.Button;
        Button2: System.Web.UI.WebControls.Button;
        procedure OnInit(e: EventArgs); override;
      private
        function GetClickText: string;
        procedure LoadPage2;
      public
      end;
    
    implementation
    
    {$REGION 'Designer Managed Code'}
    /// <summary>
    /// Required method for Designer support -- do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    procedure TWebForm1.InitializeComponent;
    begin
      Include(Self.Button1.Click, Self.Button1_Click);
      Include(Self.Button2.Click, Self.Button2_Click);
      Include(Self.Load, Self.Page_Load);
    end;
    {$ENDREGION}
    
    procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
    begin
    end;
    
    procedure TWebForm1.OnInit(e: EventArgs);
    begin
      InitializeComponent;
      inherited OnInit(e);
    end;
    
    
    function TWebForm1.GetClickText: string;
    begin
      Result := FClickText;
    end;
    
    procedure TWebForm1.LoadPage2;
    begin
      Server.Execute('WebForm2.aspx');
    end;
    
    procedure TWebForm1.Button2_Click(sender: System.Object; e: System.EventArgs);
    begin
      FClickText := 'Button2';
      LoadPage2;
    end;
    
    procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
    begin
      FClickText := 'Button1';
      LoadPage2;
    end;
    In een volgende pagina wordt er dan gekeken of de aanroepende pagina de interface ondersteund. Is dat het geval dan wordt de informatie via de interface opgehaald:

    Code:
    procedure TWebForm2.Page_Load(sender: System.Object; e: System.EventArgs);
    begin
      if Context.Handler is ITest then
        ListBox1.Items.Add('Je klikte op ' + ITest(Context.Handler).ClickText);
    end;
    Dus je ziet: communicatie tussen je pagina's kan op een ERG nette manier worden opgelost.
    Marcel

  3. #3
    Marcel bedankt voor je antwoord, maar dit ballonnetje lijkt niet op te gaan voor het probleem dat ik heb.

    Eerst wordt immers het PageLoad event van de pagina zelf getriggerd. Dit event start de PageLoad events van de usercontrols die op de pagina staan.
    Pas daarna wordt het ItemCommand event van de treeview uitgevoerd. In dit event weet ik pas de geselecteerde node. Die wordt dus te laat doorgegeven aan de betreffende usercontrols.

  4. #4
    Dat snap ik even niet meer. Je klikt op een item, dat doet een postback. Op dat moment kom je toch opnieuw in je page_load en is je item toch bekend?
    Marcel

  5. #5
    De volgorde van de events:

    PageLoad webpagina
    Pageload usercontrol
    PageUnload usercontrol
    ItemCommand of ItemChanged van de treeview op webpagina
    PageUnload webpagina

    In de PageLoad van de pagina wordt, vermoed ik, het treeview component op de pagina 'geplaatst'. Dan volgen er allerlei events die de status van de diverse componenten kunnen beinvloeden. Zo dus ook voor de treeview in zijn OnItemCommand/Itemchanged.
    De PageUnload haalt de inmiddels afgewerkte pagina uit het geheugen.
    Na een PageUnload kan je dus geen invloed meer uitoefenen op de aanwezige componenten.

    In het PageLoad event van de webpagina moet ik dus de geselecteerde node al kennen om die te kunnen doorgeven aan de aanwezige usercontrols.

  6. #6
    Hmm, dan wordt die treeview dus pas erg laat op het juiste item gezet. Heb je misschien een testprojectje waar we mee kunnen testen?
    Marcel

  7. #7

    testproject

    In bijlage een testproject voor de geinteresseerden.
    Het is het voorbeeld van Marcel (maar de knoppen even op invisible gezet), uitgebreid met een treeview van powerupasp en een usercontrol.
    Attached Files Attached Files

  8. #8
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Doe het volgende:

    1) Voeg een variabele toe in je WebForm met dezelfde naam als het id van de usercontrol. Gezien dit bij jou <uc1:webusercontrol1 id=UserControl1 runat="server"> is wordt dat:
    Code:
    strict protected
      Button1: System.Web.UI.WebControls.Button;
      Button2: System.Web.UI.WebControls.Button;
      // ...
      UserControl1: WebUserControl1.TWebUserControl1;
    2) Voeg in je Usercontrol een property toe om de Text van de label te zetten:
    Code:
    public
      function get_Text: string;
      procedure set_Text(const Value: string);
      property Text: string read get_Text write set_Text;
    
    ///..
    function TWebUserControl1.get_Text: string;
    begin
      Result := Label1.Text
    end;
    
    procedure TWebUserControl1.set_Text(const Value: string);
    begin
      Label1.Text := Value
    end;
    3) Wijzig de ItemCommand eventhandler van de Treeview:
    Code:
    procedure TWebForm1.Treeview1_ItemCommand(
          sender: System.Object; 
          args: PowerUp.Web.UI.WebTree.TreeCommandEventArgs);
    var
      vData : TreeDataItem;
    begin
      vData := args.Item.DataItem;
      Label1.Text := vdata['Name'].ToString + ' ' + 
                     vdata['JobTitle'].ToString + ' ' + 
                     vdata['Age'].ToString + ' years old';
      ListBox1.Items.Add('Treeview1_ItemCommand');
      // zet de text van de label in UserControl1
      UserControl1.Text := Label1.Text;
    end;
    Viola.
    All methodologies are based on fear. -- Kent Beck.

  9. #9
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Ook nog:
    Noteer dat je de interface niet meer nodig hebt, noch de Page_Load eventhandler in de WebUserControl. Je hebt dus ook niet de ClickText property nodig, al zou je die kunnen gebruiken om de messages te forwarden naar de usercontrol, eventueel via een interface zoals Marcel heeft gedemonstreerd (maar dan in je WebForm):
    Code:
    public
      procedure set_ClickText(const Value: string);
      function get_ClickText: string;
      property ClickText: string read get_ClickText write set_ClickText;
    
    //..
    procedure TWebForm1.set_ClickText(const Value: string);
    begin
      UserControl1.Text := Value;
    end;
    
    function TWebForm1.get_ClickText: string;
    begin
      Result := UserControl1.Text
    end;
    
    procedure TWebForm1.Treeview1_ItemCommand(
        sender: System.Object; 
        args: PowerUp.Web.UI.WebTree.TreeCommandEventArgs);
    var
      vData : TreeDataItem;
    begin
      vData := args.Item.DataItem;
      ClickText := vdata['Name'].ToString + ' ' + 
                   vdata['JobTitle'].ToString + ' ' +
                   vdata['Age'].ToString + ' years old';
    end;
    All methodologies are based on fear. -- Kent Beck.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Usercontrol op PlaceHolder plaatsen
    By dymo in forum .NET
    Replies: 2
    Last Post: 28-Sep-04, 23:24
  2. UserControl gebaseerd op Panel
    By jchompff in forum .NET
    Replies: 17
    Last Post: 15-Jan-04, 17:28
  3. UserControl
    By rieni in forum .NET
    Replies: 2
    Last Post: 26-Dec-03, 19:54

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •