Auf Event von Control reagieren, was zur Laufzeit geladen wurde

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von haiyyu.

    Auf Event von Control reagieren, was zur Laufzeit geladen wurde

    Hallo Leute,

    ich habe mir grade nach dieser Anleitung einen tabbasierten Browser gebastelt, jetzt habe ich aber folgendes Problem:
    Durch diese Funktion werden die Tabs hinzugefügt und die Webbrowser zur Laufzeit geladen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim Browse As New WebBrowser
    2. TabControl2.TabPages.Add(1, "Page" & i)
    3. TabControl2.SelectTab(i - 1)
    4. TabControl2.SelectedTab.Controls.Add(Browse)
    5. Browse.Name = "wb"
    6. Browse.Dock = DockStyle.Fill
    7. i = i + 1

    Ich möchte gerne, dass wenn die Seite geladen wurde, via Webbrowser_Navigated der Tabtitel und die Adresse in der Adressleiste geupdated werden.
    Sprich:

    Ich gebe in die Adressleiste "google.de" ein.
    Wenn der Browser dann navigiert hat, ändert er in der Adressleiste das "google.de" in "http://www.google.de" und den Tabtitel eben in den Seitennamen.
    Jetzt weiß ich aber leider nicht, wie ich auf ein Event reagiere, das von einem Control kommt, welches ich zur Laufzeit geladen habe.

    Ich hoffe jemand kann mir helfen ^^
    Event kannst du mit der AddHandler-Anweisung dynamisch hinzufügen.

    VB.NET-Quellcode

    1. AddHandler Event Delegat
    In deinem Fall müsstest du dir eine Sub erstellen, die die Signatur des jeweiligen Event-Handlers besitzt, und diese per AddHandler dem Event hinzufügen. Beispiel:

    VB.NET-Quellcode

    1. Sub AddBrowser()
    2. Dim Browse As New WebBrowser
    3. TabControl2.TabPages.Add(1, "Page" & i)
    4. TabControl2.SelectTab(i - 1)
    5. TabControl2.SelectedTab.Controls.Add(Browse)
    6. Browse.Name = "wb"
    7. Browse.Dock = DockStyle.Fill
    8. AddHandler Browse.Navigated, AddressOf Browser_Navigated
    9. i = i + 1
    10. End Sub
    11. Sub Browser_Navigated(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs)
    12. Dim CallingBrowser As WebBrowser = DirectCast(sender, WebBrowser) ' herausfinden, welches WebBrowser-Objekt das Event ausgelöst hat
    13. End Sub
    Klasse!
    Gibt es auch eine Möglichkeit mir von Browser_Navigated einen Wert zurückgeben zu lassen?
    Hintergrund ist der, dass ich mir in einer anderen Funktion einen bestimmten String aus der Webseite ausgeben lassen will.

    Jetzt habe ich das Folgendermaßen realisiert:

    Das ist die Funktion die mir einen Code zurückliefern soll:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function GetPreCode(ByVal brwse As Windows.Forms.WebBrowser, ByVal url As String)
    2. brwse.Navigate(url)
    3. AddHandler brwse.Navigated, AddressOf Browse_Ref
    4. End Function


    Ich kann aber erst den Code aus der Webseite lesen, wenn diese geladen ist, hierfür also der Eventhandler, welcher so aussieht:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Browse_Ref(ByVal sender As Object, ByVal e As WebBrowserNavigatedEventArgs)
    2. Dim CallingBrowser As WebBrowser = DirectCast(sender, WebBrowser)
    3. Dim splitstr As String() = Split(CallingBrowser.Url.ToString(), "=")
    4. code = splitstr(1)
    5. End Sub



    Wie kann ich jetzt aber machen, dass die GetPreCode()-Funktion mir diesen Code zurückliefert?
    Entweder mit einem Lock, das würde allerdings den Thread blockieren und wäre nicht der Sinn der Sache.
    Oder du führst den Code, der den Rückgabewert der Funktion benötigt, direkt im Event aus.
    Das Problem ist folgendes:

    Ich benötige das ganze für eine Desktop-Facebook-Application und wollte das ganze gerne in einer eigenständigen Library machen. Ich brauche also ab irgendeinem Punkt einen Rückgabewert oder Property auf die ich dann in der Mainform zugreifen kann. Sequentiell betrachtet sind die benötigten Schritte folgende:

    1. Ich muss im WebBrowser-Element einen Link öffnen indem ich die Zugriffberechtigungen festlege.
    2. Danach werde ich weitergeleitet auf eine Webseite, in der die URL einen Code beinhaltet, mit dem ich ein AccessToken beantragen kann.
    3. Danach kann ich mir via HTTPRequest den AccessToken holen.

    Den AccessToken benötige ich in der Hauptform um Abfragen machen zu können, also sollte der optimale Ablauf so sein:

    VB.NET-Quellcode

    1. Private Sub mainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim accessToken As String = GetAccessToken(alle variablen, die dafür benötigt werden)
    3. End Sub


    Was der ganzen Sache das Genick bricht, ist die Sache mit dem WebBrowser_Navigated, da man den ersten Schritt nicht ohne Explorer ausführen kann.

    Da ich das ganze als potentielle, eigenständige Library haben will, möchte ich , dass alles wichtige innerhalb dieses Moduls gemacht wird...