Tabcontrol et addhandler

Résolu
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008 - 26 juil. 2008 à 17:29
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008 - 21 août 2008 à 18:09
Bonjour,

dans mon apprentissage du VB.NET, j'ai un problème avec les tabcontrol :

je fais un système d'onglet dynamiques de ce style :

Private compteur
As
Integer = 0

Private
Sub Button1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Button1.Click

Dim onglet
As
New System.Windows.Forms.TabPage
TabControl1.Controls.Add(onglet)
compteur = compteur + 1
onglet.Text =
"Onglet" & compteur
TabControl1.SelectedIndex = compteur

AddHandler TabControl1.TabIndexChanged, AddressOf TabControl1_TabIndexChanged

End
Sub

Private
Sub TabControl1_TabIndexChanged(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles TabControl1.TabIndexChanged

MsgBox(
"ok")

End
Sub

Quand je cliques sur Button1, le nouvel onglet s'ouvre bien, le nom est ok et il passe bien en premier plan par rapport à l'onglet précédent mais je ne passe pas par TabControl1_TabIndexChanged. Quel serait l'évènement qui me permettrait de passer par TabControl1_TabIndexChanged à l'ouverture de l'onglet?

Merci d'avance,

Fred
A voir également:

22 réponses

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
2 août 2008 à 13:50
voici ce que tu veux faire:
Public Class Form1
    Private compteur As Int16
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim onglet As New System.Windows.Forms.TabPage

        compteur = compteur + 1
        onglet.Text = "Onglet" & compteur
        TabControl1.TabPages.Add(onglet)
        Dim wb As New WebBrowser
        wb.Url = New Uri("http:\\www.google.fr")
        wb.Dock = DockStyle.Fill
        wb.Name = "wb" & compteur
        TabControl1.TabPages(compteur).Controls.Add(wb)
        TabControl1.SelectedIndex = compteur
        AddHandler wb.DocumentCompleted, AddressOf AllWeb_DocumentCompleted
    End Sub
    Private Sub AllWeb_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)
        TabControl1.TabPages(TabControl1.SelectedIndex).Text = sender.Document.Title
    End Sub

End Class
@+
youpi :)
3
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
26 juil. 2008 à 17:54
pardon, je me suis mal exprimé, par quel évènement puis-je passer pour continuer une fois l'onglet ouvert
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
30 juil. 2008 à 14:35
SAlut,

Utilises SelectedIndexChanged

Sinon ajoutes des pages plutot comme cela: TabControl1.TabPages.Add(onglet)
@+
youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
30 juil. 2008 à 15:46
Salut,
merci pour ta réponse. Avec SelectedIndexChanged, j'ai bien la msgbox qui apparait (cf code au dessus). Par contre, quand j'ouvre le 1er onglet, la msgbox apparait une fois, quand j'en ouvre un 2è, elle apparait fois et ainsi de suite.  Comment faire pour que la procédure TabControl1_SelectedIndexChanged ne s'exécute qu'une seule fois?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
30 juil. 2008 à 16:40
Comprend pas, désolé.
TabControl1_SelectedIndexChanged n'est executé que lorsque tabindex change, donc pas 2 fois

code
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim onglet As New System.Windows.Forms.TabPage

        compteur = compteur + 1
        onglet.Text = "Onglet" & compteur
        'TabControl1.SelectedIndex = compteur
        TabControl1.TabPages.Add(onglet)
    End Sub

    Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
        MsgBox("ok")
    End Sub
tu n'as pas besoin defaire un addhandler... ton tabcontrol est déjà génré dans le designer comme friend with events....
@+
youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
30 juil. 2008 à 18:56
Salut, en fait, pour apprendre, j'aimerais me faire un navigateur avec un système d'onglet dynamique. J'ai donc pour chaque onglet un axwebbrowser. Pour gérer chaque axwebbrowser et comme je ne sais pas combien il y en aura, je pensais passer par un addhandler, d'après ce que j'ai pu lire, ça a l'air d'être la meilleure méthode. De plus, j'ai l'impression qu'on ne peut pas mettre de nom à un axwebbrowser.
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
31 juil. 2008 à 10:01
Salut,

Pour ton Tab contronl tu n'as pas besoin de créer un handler parce que l'a déjà créer avec le designer de visual. en revanche si tu le créé dynamiquement il faudra effectivement que tu lui  ajoutes un handler. Par contre, pour tes webbrowser si tu les créés dynamiquement il faudra que tu créés leurs propres handlers pour que tu puisses catcher les évenements.

petite question, tu utilises bien visual 2005 ou 2008, pourquoi tu prend axwebbrowser? pourquoi tu prends pas le webbrowser fournit par le framework?
@+
youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
31 juil. 2008 à 12:09
salut,
j'utilise bien VS 2008.
Pour l'axwebbrowser, c'est tout simplement parce qu'en regardant quelques tutoriaux, j'ai vu que c'était le plus utilisé. Tu connaîtrais les avantages et inconvénients de chaque?
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
1 août 2008 à 09:38
Salut,
écoute non je connais pas les différences mais webbrowser est fournit automatiquement donc mieux documenter et plus facile d'utilisation.
tu as réglé ton problème au faite?
@+
youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
1 août 2008 à 12:37
Salut,
je n'arrive pas à régler mon problème. J'ai modifié mon code de la façon suivante :








Private
compteur

As



Integer
= 0


Dim
onglet

As



New
System.Windows.Forms.TabPage


Dim
Webpage

As



New
System.Windows.Forms.WebBrowser


Private



Sub
Button1_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
Button1.Click
   TabControl1.TabPages.Add(onglet)
   compteur = compteur + 1
   onglet.Text =

"Onglet"
& compteur
   onglet.Name = onglet.Text
   onglet.Controls.Add(Webpage)
   Webpage.Name =

"Webpage"
& compteur
   TabControl1.SelectedIndex = compteur


   AddHandler
TabControl1.SelectedIndexChanged,

AddressOf
Naviguer


End



Sub






Private



Sub
Naviguer(

ByVal
sender

As



Object
,

ByVal
evArgs

As
EventArgs)
   Webpage.Navigate(


http://www.google.fr

)


End



Sub

Quand je le lance, les onglets s'ouvrent bien mais la navigation ne se fait pas. De plus, quand je fais un debug pas à pas, il ne passe par Naviguer() qu'après le 2è clic sur Button1.
Quand tu me dis que je dois créer mes propres handlers, que veux tu dire par là?

Merci pour tout

Fred
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
1 août 2008 à 14:12
vire ton AddHandler TabControl1.SelectedIndexChanged,
AddressOf Naviguer

ton TabControl1 a deja un Friend with events regarde dans ton designer tu veras.... oublie le...

Qu'est ce que tu veux faire quand l'utilisateur change d'onglet aller sur google... c bête...
Je pense ce que tu veux faire c a chaque fois que tu crées ton onglet il va sur google ce qui est différent donc ton selectedIndexChanged ne sert à rien.
si pour une raison ou une autre tu veux quand meme que lorsque l'on change d'onglet il affiche un site exemple free
voici le code
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim onglet As New System.Windows.Forms.TabPage

        compteur = compteur + 1
        onglet.Text = "Onglet" & compteur
        TabControl1.TabPages.Add(onglet)
        Dim wb As New WebBrowser
        wb.Url = New Uri("http:\\www.google.fr")
        wb.Dock = DockStyle.Fill
        wb.Name = "wb" & compteur
        TabControl1.TabPages(compteur).Controls.Add(wb)
        TabControl1.SelectedIndex = compteur

    End Sub

    Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
        Try
            Dim CurrentWb As WebBrowser = DirectCast(TabControl1.TabPages(TabControl1.SelectedIndex).Controls("wb" & TabControl1.SelectedIndex), WebBrowser)
            CurrentWb.Navigate("www.free.fr")
        Catch ex As Exception

        End Try

    End Sub

il son site de départ c google et quand tu changes d'onglet il va sur free
navigue tu veras.
Enfin bref explique ce que tu veux faire parce que la... ce code me parait inutile
@+

youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
1 août 2008 à 15:55
Merci,
ce que je veux faire, c'est un navigateur tout ce qu'il y a de plus standard : je cliques sur un bouton qui ouvre un nouvel onglet avec un webbrowser. A l'ouverture de l'onglet se charge la page de démarrage. Mon problème était de gérer les différents webbrowser créés à l'ouverture des ongletset notamment celui qui est visible. Mais on dirait que ta fonction DirectCast(TabControl1.TabPages(TabControl1.SelectedIndex).Controls("wb" & TabControl1.SelectedIndex), WebBrowser) sert à ça. Et ta fonction TabControl1.TabPages(compteur).Controls.Add(wb) règle un autre de mes problèmes.Par contre, à quoi sert wb.Url = New Uri("http:\\www.google.fr") ?
En tout cas, tu as réglé un de mes gros problèmes.
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
1 août 2008 à 16:13
Salut juste ce code te servira alors.
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim onglet As New System.Windows.Forms.TabPage

        compteur = compteur + 1
        onglet.Text = "Onglet" & compteur
        TabControl1.TabPages.Add(onglet)
        Dim wb As New WebBrowser
        wb.Url = New Uri("http:\\www.google.fr")
        wb.Dock = DockStyle.Fill
        wb.Name = "wb" & compteur
        TabControl1.TabPages(compteur).Controls.Add(wb)
        TabControl1.SelectedIndex = compteur

    End Sub

Uri est " uniform resource identifier" le contructeur des liens html.
tu veras url n'accepte que des uri...
par contre c'est la que tu auras peut etre besoin de creer tes handlers mais sur les webbrowser et non sur le tab control

youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
1 août 2008 à 19:22
salut,
grâce à toi et cette fonction DirectCast(TabControl1.TabPages(TabControl1.SelectedIndex).Controls("wb" & TabControl1.SelectedIndex), WebBrowser), j'ai déjà fait un grand pas. Le dernier petit(?) problème : je voudrais qu'une fois la page web chargée, le titre de la page s'affiche dans l'onglet et dans la barre de titre. J'y arrive déjà pour le 1er onglet créé en dur dans le Design via wb0_DocumentCompleted(

ByVal sender
As

Object
,
ByVal
e
As
System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)
Handles
wb0.DocumentCompleted

Je devrais donc créér une fonction

wb_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted

et c'est là où je pense que tu voulais en venir quand tu disais que j'ai besoin de créer mes handlers. Mais comment faire? Et une fois cette fonction créée, dois-je l'appeler ou sera-t-elle appelée automatiquement?

Encore merci!
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
2 août 2008 à 19:54
Salut,
grâce à toutes tes explications, j'ai quasiment fini ce que je voulais faire et je vois à peu près le fonctionnement des Addhandlers.
Je vais juste abuser encore un peu pour une question qui n'a rien à voir mais je n'ai pas trouvé la réponse dans le forum :

je voudrais faire un copier/coller/couper/sélectionner tout/supprimer en utilisant ExecWB mais je ne l'ai pas avec Webbrowser (alors que je l'avais avec axwebbrowser). J'ai trouvé cette propriété : CurrentWb.document.ExecCommand()  mais il me demande 3 arguments et je ne sais pas quoi mettre, si c'est bien la bonne propriété

Merci,
Fred
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
2 août 2008 à 21:58
c'est bon, c'est trouvé.
Encore merci Youpi
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
17 août 2008 à 19:42
Hello Youpi,

je reviens vers toi en même temps que je reviens sur mon sujet : J'ai pu le peaufiner pas mal grâce à tes conseils mais il me reste un dernier gros problème : J'ai fait un bouton de suppression d'onglets. La suppression en elle même marche bien mais pour que je puisse réutilisé les suivants celui qui a été supprimé. Je m'explique : je ne peux pas réutilisé les onglets suivant celui qui a été supprimé car le nom du webbrowser n'est pas associé à l'index de l'onglet. Si tu préfères, si je supprime le 2è onglet (sur 3) le 3è va retrouver l'index 1 vu qu'il passera en 2è mais son webbrowser attaché gardera le nom de wb2 alors que pour utiliser la fonction Dim CurrentWb
As
WebBrowser =
DirectCast
(TabControl1.TabPages(TabControl1.SelectedIndex).Controls(
"wb"
& TabControl1.SelectedIndex), WebBrowser)
le nom devrait passer à wb1. D'où ma question : comment faire pour que tous les noms des wb"x" après l'onglet supprimé soit wb"x-1"?

Merci,
Fred
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
18 août 2008 à 12:26
Salut
disons que tu supprimes l'index 3 et que ton premier onglet possede onglet0+wb0:
Imaginons une procedure de ce style avec en parametre l'index supprimé
DeleteTabControl(3)

    Private Sub DeleteTabControl(ByVal index As Int16)
        Dim tabindex As Int16
        TabControl1.TabPages.RemoveAt(index)
        For Each tb As TabPage In TabControl1.TabPages
            tabindex = Val(Replace(tb.Name, "TabPage", ""))
            If tabindex >= index Then
                tabindex -= 1
                tb.Name = "TabPage" & tabindex
                Dim curwb As WebBrowser = TabControl1.TabPages("TabPage" & tabindex).Controls("wb" & tabindex + 1)
                curwb.Name = "wb" & tabindex
            End If
        Next
    End Sub

Je ne suis pas persuadé que c'est la meilleur façon pour toi de naviguer entre les onglets. mais bon voici la solution a ton précédent post.
@+
youpi :)
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
20 août 2008 à 21:29
Salut,

Bon ça y est, c'est fini!

Ta fonction me donnait le même résultat mais en la modifiant un peu, cela marche. J'ai fait comme cela

Private
Sub DeleteTabControl(
ByVal index
As Int16)
   TabControl1.TabPages.RemoveAt(index)
   TabControl1.SelectedIndex = index

   For
Each tb
As TabPage
In TabControl1.TabPages

      Dim tabindex
As
String =
CInt(Mid(tb.Name, 7, 1))

      If tabindex >= index
Then
         tabindex -= 1
         tb.Name =
"Onglet" & tabindex

         Dim curwb
As WebBrowser = TabControl1.TabPages(
"Onglet" & tabindex).Controls(
"wb" & tabindex + 1)
         curwb.Name =
"wb" & tabindex

      End
If
   Next
End
Sub

Merci pour tout!
Fred
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
20 août 2008 à 21:31
enfin après t'avoir relu, j'ai juste modifié Val(Replace(tb.Name, "TabPage", ""))  par CInt(Mid(tb.Name, 7, 1))
0
Rejoignez-nous