begin process at 2012 02 12 12:24:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VB.NET

 > EMPÊCHER LE CLIC SUR UN ONGLET (TABPAGE) D’UN TABCONTROL

EMPÊCHER LE CLIC SUR UN ONGLET (TABPAGE) D’UN TABCONTROL


 Information sur la source

Note :
8,14 / 10 - par 7 personnes
8,14 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VB.NET Source .NET ( DotNet ) Classé sous :tabcontrol, tabpage, onglet Niveau :Initié Date de création :21/10/2005 Date de mise à jour :01/11/2005 18:57:21 Vu :13 216

Auteur : Atalante1108

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour à tous,

Voilà, suite à un problème que j’ai rencontré et auquel j’ai finalement trouvé une solution, je me permets de poster une source ici, car je pense que ma solution pourra (je l’espère !) aider également d’autres personnes.

En fait, le problème pourrait se résumer ainsi :
« Comment faire pour empêcher l’utilisateur de cliquer sur une page (TabPage) d’un TabControl ? »

J’ai recherché des solutions sur ce site et n’ai malheureusement rien trouvé de satisfaisant pour résoudre mon problème particulier. (Bon, ok, j’avoue, mon temps de recherche se compte plus en minutes qu’en heures, et si j’avais approfondi un peu plus ma recherche j’aurai peut-être trouvé une solution, m’enfin...)

C’est pourquoi je poste ici ma 1ère source, alors soyez indulgents svp ! ;)

Je suis loin d’être une professionnelle, je ne suis qu’étudiante ; donc il est fort possible que ma solution soit loin d’être la plus adaptée, ni la plus efficace ; mais en l’occurence, elle fonctionne, et c’est déjà pas mal ! ;)

Pour expliquer plus clairement le problème je vais vous donner l’exemple de mon application.

Suite à un exercice donné en cours, j’ai créé une application toute simple permettant d’ajouter un employé, d’afficher les informations concernant tous les employés et de calculer leur salaires. Le but de l’exercice était juste de nous familiariser avec les collections (arraylist) ainsi que la lecture/écriture de fichiers avec les classes StreamReader et StreamWriter.

Je n’ai pas besoin de rentrer plus dans les détails car cela n’aura pas d’intérêt pour la suite ; mais en gros, j’ai décidé d’utiliser le composant « TabControl » dans « Windows Forms » (petite précision : j’utilise la version anglaise de Visual Studio et je ne suis pas sûre de la traduction pour la version française donc je laisse comme ça, mais je pense que vous voyez de quoi je parle) pour mon « Menu ».
J’ai ajouté 4 « TabPages » (onglets) dans ce TabControl :
- tabHome (la page d’accueil),
- tabAdd (pour ajouter un employé),
- tabDisplay (pour afficher les informations concernant un employé en le choisissant dans une liste, et pour le modifier/supprimer),
- tabPayroll (pour afficher le salaire de chaque employé dans une liste)

Mon problème est survenu lors de la programmation du bouton « Modify » pour modifier les informations d’un employé. En effet, un clic sur le bouton modifier provoque la disparition de celui-ci, l’apparition de boutons « Save » et « Cancel », la possibilité d’écrire dans les textbox et l’interdiction de cliquer ailleurs que sur Sauvegarder ou Annuler.

D’où mon problème : l’utilisateur se trouvant dans la page tabDisplay décide de sélectionner un employé et de le modifier, mais au lieu de choisir Sauvegarder ou annuler, il clique finalement sur un autre onglet de mon menu.
Je ne voulais pas que cela soit possible avant d’avoir soit sauvegardé, soit annulé les modifications éventuelles.

Durant mes recherches pour résoudre le problème et ainsi empêcher le clic sur un onglet (et donc l’affichage de celui-ci) j’ai trouvé diverses solutions :
> mettre la propriété « enabled » de la page onglet à « false »
Résultat : on peut toujours cliquer sur l’onglet et la page s’affiche, mais tous ses composants sont « disabled ». => ne marche pas
> appeller la procédure « Hide » ou bien mettre la propriété « Visible » à « false » de la page onglet
Résultat : on peut toujours cliquer sur l’onglet, mais tous les composants de cette page ont disparus. => ne marche pas
> utiliser la méthode « Remove » du TabControl pour enlever la TabPage, puis « Add » pour la rajouter une fois les modifications faites
Résultat : supprime carrément la page et en rajoute une vierge => ne marche pas DU TOUT
> sélectionner la TabPage sur laquelle on veut rester avec TabControl.SelectedTab
Résultat : y’a de l’idée, (et d’ailleurs, c’est ce qui m’a mis sur la voie) mais incomplet

Voici donc, après tout ce blablabla, MA solution.
L’idée est de déclarer une variable globale (c’est à dire, au début du code et qui pourra être utilisée partout dans le code) booléenne, qui en gros permettra oui ou non de cliquer sur d’autres onglet que celui où je suis.

Source

  • 'declaration de la variable globale booléenne = vrai par défaut car normalement on a le droit de cliquer sur les pages
  • Private allowClickTab As Boolean = True
  • 'procédure événementielle "SelectedIndexChanged" de mon objet TabControl (que j’ai appellé tabPayrollArray) qui est appellée lorsque l’on choisit/clique sur un onglet dans le tabcontrol
  • Private Sub tabPayrollArray_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tabPayrollArray.SelectedIndexChanged
  • 'si l’onglet sélectionné est soit Home, Add, OU Payroll, ET que ma variable booléenne « allowClickTab » est à « False »
  • 'If ((tabPayrollArray.SelectedTab Is tabHome) Or (tabPayrollArray.SelectedTab Is tabAdd) Or (tabPayrollArray.SelectedTab Is tabPayroll))
  • 'PRECISION: les noms de tabpages que j’ai utilisé dans ma condition (tabHome, etc) sont bien évidemment les noms de toutes mes pages/onglets AUTRE que celui où l’utilisateur doit rester, et il faudra donc adapter votre code en fonction de vos propres TabPages et de celle(s) dont vous voulez empêcher le clic.
  • 'modification de ma condition suite a un commentaire de Diesel78, c'est mieux et + simple avec un If Not; merci encore! :)
  • If (Not tabPayrollArray.SelectedTab Is tabDisplay) And allowClickTab = False Then
  • 'Resélectionne l’onglet Display c’est-à-dire la page dans laquelle je veux rester. En clair, si on sélectionne un autre onglet, il reselectionnera automatiquement l’onglet où l’on veut rester.
  • tabPayrollArray.SelectedTab = tabDisplay
  • 'affiche un message indiquant à l’utilisateur qu’il doit cliquer d’abord sur Save ou Cancel avant de pouvoir cliquer ailleurs
  • MsgBox("Please save or cancel your modifications before leaving this page", MsgBoxStyle.Information, "Modify an Employee")
  • End If
  • End Sub
  • 'Enfin, il ne reste plus qu’à décider quand on veut empêcher le clic sur les autres onglets.
  • 'Dans mon example, c’est après avoir cliqué sur le bouton « Modifier » que je veux empecher un clic sur un autre onglet.
  • 'Dans l’évènement clic de mon bouton, je dois juste rajouter :
  • Private Sub btnDisplayModify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayModify.Click
  • 'met à false ma variable booléenne
  • allowClickTab = False
  • End Sub
  • 'Ceci va permettre de rendre ma condition dans ma procédure TabControl.SelectedIndexChanged VRAIE et donc empêcher le clic
  • 'Pour permettre, une fois la sauvegarde ou annulation, de pouvoir cliquer de nouveau sur les onglets, il faut attribuer la valeur TRUE à ma variable dans les événements click de mes boutons Save et Cancel
  • Private Sub btnDisplayCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayCancel.Click
  • 'met à true ma variable booléenne
  • allowClickTab = True
  • End Sub
  • Private Sub btnDisplaySave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplaySave.Click
  • 'met à true ma variable booléenne
  • allowClickTab = True
  • End Sub
  • 'NOTE: Dans mon programme, cliquer sur Save ou Cancel permet également de rafficher le bouton Modifier et de cacher Save et Cancel. Inversement, cliquer sur Modifier permet d'afficher Save et Cancel et de cacher Modifier. Je n'ai pas rajoute ici le code car il n'est pas necessaire ici, mais pour expliquer brievement, il suffit d'utiliser la fonction Hide et Show des boutons que l'on veut afficher ou cacher dans l'evenement Click du bouton correspondant.
'declaration de la variable globale booléenne = vrai par défaut car normalement on a le droit de cliquer sur les pages

Private allowClickTab As Boolean = True

'procédure événementielle "SelectedIndexChanged" de mon objet TabControl (que j’ai appellé tabPayrollArray) qui est appellée lorsque l’on choisit/clique sur un onglet dans le tabcontrol

Private Sub tabPayrollArray_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tabPayrollArray.SelectedIndexChanged

'si l’onglet sélectionné est soit Home, Add, OU Payroll, ET que ma variable booléenne « allowClickTab » est à « False »
'If ((tabPayrollArray.SelectedTab Is tabHome) Or (tabPayrollArray.SelectedTab Is tabAdd) Or (tabPayrollArray.SelectedTab Is tabPayroll)) 
'PRECISION: les noms de tabpages que j’ai utilisé dans ma condition (tabHome, etc) sont bien évidemment les noms de toutes mes pages/onglets AUTRE que celui où l’utilisateur doit rester, et il faudra donc adapter votre code en fonction de vos propres TabPages et de celle(s) dont vous voulez empêcher le clic. 

'modification de ma condition suite a un commentaire de Diesel78, c'est mieux et + simple avec un If Not; merci encore! :)
If (Not tabPayrollArray.SelectedTab Is tabDisplay) And allowClickTab = False Then

'Resélectionne l’onglet Display c’est-à-dire la page dans laquelle je veux rester. En clair, si on sélectionne un autre onglet, il reselectionnera automatiquement l’onglet où l’on veut rester. 

tabPayrollArray.SelectedTab = tabDisplay

'affiche un message indiquant à l’utilisateur qu’il doit cliquer d’abord sur Save ou Cancel avant de pouvoir cliquer ailleurs

MsgBox("Please save or cancel your modifications before leaving this page", MsgBoxStyle.Information, "Modify an Employee")

End If

End Sub

'Enfin, il ne reste plus qu’à décider quand on veut empêcher le clic sur les autres onglets.

'Dans mon example, c’est après avoir cliqué sur le bouton « Modifier » que je veux empecher un clic sur un autre onglet.
'Dans l’évènement clic de mon bouton, je dois juste rajouter : 

Private Sub btnDisplayModify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayModify.Click
'met à false ma variable booléenne 
allowClickTab = False
End Sub

'Ceci va permettre de rendre ma condition dans ma procédure TabControl.SelectedIndexChanged VRAIE et donc empêcher le clic 

'Pour permettre, une fois la sauvegarde ou annulation, de pouvoir cliquer de nouveau sur les onglets, il faut attribuer la valeur TRUE à ma variable dans les événements click de mes boutons Save et Cancel

Private Sub btnDisplayCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayCancel.Click
'met à true ma variable booléenne 
allowClickTab = True
End Sub

Private Sub btnDisplaySave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplaySave.Click
'met à true ma variable booléenne 
allowClickTab = True
End Sub

'NOTE: Dans mon programme, cliquer sur Save ou Cancel permet également de rafficher le bouton Modifier et de cacher Save et Cancel. Inversement, cliquer sur Modifier permet d'afficher Save et Cancel et de cacher Modifier. Je n'ai pas rajoute ici le code car il n'est pas necessaire ici, mais pour expliquer brievement, il suffit d'utiliser la fonction Hide et Show des boutons que l'on veut afficher ou cacher dans l'evenement Click du bouton correspondant. 


 Conclusion

VOILA, C’EST FINI, ENJOY!

Ce n’est pas plus compliqué (n’ayons pas peur des mots, c’est même très simple) que cela et ça permet d’empêcher un utilisateur de cliquer sur d’autres onglets quand il doit d’abord effectuer une action précise à l’intérieur d’un onglet.

Bon l’inconvénient est que ça oblige à passer par l’intermédiaire d’une variable globale, m’enfin, à l’heure actuelle je n’ai pas encore trouvé de meilleure solution.

N’hésitez pas à poser vos questions, écrire d’éventuels commentaires/critiques et à me demander plus d’explications ou de précisions si jamais vous avez besoin ; j’ai essayé d’être claire mais ce n’est peut-être pas suffisant...

Et si jamais vous avez une autre solution, merci de me l’indiquer, ça pourra toujours m’aider !

Merci de votre attention, et en espérant avoir pu vous donner un petit conseil, et peut-être même vous avoir aidé à résoudre un de vos problèmes, je vous souhaite une bonne prog avec notre ami VB.NET ! ;)


 Historique

21 octobre 2005 15:35:51 :
juste une correction pour afficher correctement les commentaires dans le code.
21 octobre 2005 15:38:44 :
pareil ;)
01 novembre 2005 18:57:21 :
modification de la condition dans l'evenement SelectIndexChanged de mon TabControl

 Sources du même auteur

Source .NET (Dotnet) SUPPRIMER UNE LIGNE D’UN FICHIER TEXTE EN UTILISANT UNE COLL...

 Sources de la même categorie

Source .NET (Dotnet) MODIFICATION DATE DE WINDOWS EN VB.NET ET VBA par us_30
Source avec Zip Source avec une capture Source .NET (Dotnet) ENVOI DE MAIL AVEC PIÈCE JOINTE par EhJoe
Source .NET (Dotnet) AMUSONS NOUS AVEC UN LABEL ^^ par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) UN NAVIGATEUR INTERNET EN VB.NET par azrti
Source avec Zip Source .NET (Dotnet) CONVERSION DE DEVISE MONAITAIRE VIA UN SERVICE WEB par bigmonkey7

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) GRISER LES ONGLETS EN VB.NET par circular
Source avec Zip Source avec une capture ADDIN: BARRE D'ONGLETS POUR VISUAL BASIC par Charles Racaud
Source avec Zip Source avec une capture TAB CONTROL (WINDOWS MEDIA PLAYER 10 ) par bouv
Source avec Zip UTILISATION DU CONTRÔLE SSTAB par RicoNuch
Source avec une capture Source .NET (Dotnet) TABCONTROL VERTICAL par The French Touch

Commentaires et avis

Commentaire de OneHacker le 22/10/2005 11:01:21

Je n'ai pas encore eu le temps de regarder ta source, mais voyajt le code et l'image, je te met 8/10.


Bonne continuation !

Commentaire de Nexto le 23/10/2005 03:21:50

Merci pour cette source.

Commentaire de diesel78 le 27/10/2005 00:46:34

Super, utile, solution imaginative à un problème souvent rencontré, et bien documenté.
Perso, je préfère les tests plus courts style
If Not (tabPayrollArray.SelectedTab Is tabDisplay And allowClickTab) Then ...
Mais c'est juste histoire de pouvoir dire quelque chose.

Continue!

Commentaire de Atalante1108 le 01/11/2005 18:42:34

Merci beaucoup pour vos commentaires :)
Diesel78, tu as tout a fait raison pour la condition, c + court et bien + simple d'utiliser un "If Not", j'aurai du y penser je suis nulle ;)
Bref, merci beaucoup pour ta suggestion, je vais le rajouter dans le code! ++

Commentaire de jjmaster le 27/12/2005 08:54:18

Bonne idee le probleme c'est qu'il execute quand meme l'evenement. Or moi je gere des choses sur le changement de fenetre donc ce n'est pas approprié pour moi.

Merci quand meme de proposer des solutions

Commentaire de OneHacker le 20/02/2006 13:33:48

Ca l'air impec ! Moi ca marche !

Bonne continuation !

Redman

Commentaire de lesdis le 02/05/2006 16:48:56

Bonjour,

pour ma part j'ai intercepté l'évènement avant qu'il se produise et je l'annule.

Private Sub TabControl1_Deselecting(ByVal sender As Object,_
ByVal e As System.Windows.Forms.TabControlCancelEventArgs)_
Handles TabControl1.Deselecting
        
e.Cancel = True

End Sub

Cela évite le principal problème de saut de page.

Commentaire de abraal le 17/05/2006 13:48:25

Salut !

Simpatique ton code sa m'a bien aidé !

10/10 ;)

Commentaire de alexveilleux le 24/09/2007 16:33:23 9/10

Bonjour,
J'avais besoin de voir quelque fonctionnalité de TabControl et grâce à ta source et au nombreux commentaires, j'ai trouvé ce que j'avais besoin.
Je t'ai mis 9/10 car je n'ai pas regardé le code au complet.
Merci,

Commentaire de Mario1095 le 27/01/2008 08:52:19

PAS MAL !!!!

Commentaire de casy le 13/02/2008 22:38:09

Merci pour cette source.

Je m'en sert pas directement, mais elle m'a inspiré. Moi qui cherchait une solution bien plus complexe, j'avais pas pensé au flag en variable globale.

C'est tout con mais efficace

Commentaire de mmptj le 24/04/2008 14:30:42

Bonjour,

Merci pour cette source qui m'a permis de résoudre mon problème.
Mon application utilise 3 onglets pour afficher des informations générées par une autre application.
Je voulais afficher le 1er onglet à chaque fois que rechargeais les informations.
J'ai donc donné une valeur à la propriété selectedtab

Commentaire de Spylopate le 27/01/2010 21:32:25 10/10

Merci vraiment génial ta solution ^^ je suis débutant et je cherche un peu partout sur internet pour arriver petit a petit a faire mon programme et cette fonction j'arrivais pas a trouver tu ma bien aider ^^ 10/10 merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Programmation objet et onglet tabpage [ par senpiet ] Bonjour à tous,je cherche à savoir comment créer, dans un tabControl d'un form général, un nouvel onglet, basé sur un objet indépendant.Ex.J'ai un for Accéder à un controle dans un TabPage [ par bisou580 ] Hello world,J'ai besoin d'accéder à un controle nommé "BrowserX" dans l'onglet ouvert d'un TabControl.Mais comment accéder à un controle à l'intérieur Comment sélectionner un onglet imbriqué dans un autre onglet ? [ par fabiano13 ] Bonjour, Je souhaiterai sélectionner le TabPage_7 du TabControl_2 imbriqué dans le TabPage_3 du TabControl_1. Le code suivant marche à moitié. Cela tabpage d'un tabcontrol [ par habibovitch ] bonjour, est-ce possible de délpacer un tabpage seulement d'un tabcontrol en vb.net ou considere le tabpage comme un panel comme ca on peut le déplace Propriété TabControl [Visual Studio 2010] [ par ultrachardo ] Bonjour, j'ai un formulaire qui contient TabControl, ce dernier contient deux onglet "A" et "B" ma question comment savoir quel onglet est active TabControl en vb.Net [ par us_30 ] Bonjour, Je voudrais utiliser le contrôle TabControl. Mais problème !! Il semble qu'en .NET, il est impossible de rendre invisible un onglet (contra modification du TabControl [ par blade159fr ] Bonjour, je voudrai modifier un tabcontrol pour qu'il ressemble à celui de l'IDE de VS2005 (ajouter une croix pour fermer un onglet et un menu pour ch Probléme de classes [ par Vianneyp ] (Re)Bonjour,J'ai un peu (beaucoup ?) de mal avec les classes et je souhaiterai vous poser quelques questions.J'ai créer une classe dérivée de TabPage, TabControl perso ,probleme d'onglet [ par paulof2000 ] Bonjour,Je souhaite faire mon propre control qui sera casi le meme qu'un TabControl mais avec plus de posobilité graphiques au niveau des onglets.je m Changer de couleur un titre d'onglet dans un TabControl [ par avelone ] (VB.net)Bonjour, je voudrais par programmation, changer de couleur le titre d'un onglet dans un TabControl. La propriété ForeColor permet de changer d


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales