Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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 : 9 182

Note :
7,83 / 10 - par 6 personnes
7,83 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
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

Commentaires et avis

signaler à un administrateur
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 !

signaler à un administrateur
Commentaire de Nexto le 23/10/2005 03:21:50

Merci pour cette source.

signaler à un administrateur
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!

signaler à un administrateur
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! ++

signaler à un administrateur
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

signaler à un administrateur
Commentaire de OneHacker le 20/02/2006 13:33:48

Ca l'air impec ! Moi ca marche !

Bonne continuation !

Redman

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de abraal le 17/05/2006 13:48:25

Salut !

Simpatique ton code sa m'a bien aidé !

10/10 ;)

signaler à un administrateur
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,

signaler à un administrateur
Commentaire de Mario1095 le 27/01/2008 08:52:19

PAS MAL !!!!

signaler à un administrateur
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

signaler à un administrateur
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

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 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 VB.Net TabControl [ par MagDix ] Salut..J'aimerais utiliser un TabControl dans mon prog...J'aimerais faire une condition... Si je suis sur l'onglet 1 alors....ou si je suis sur l'ongl Tabpage+listview dynamiques [ par nerone21 ] Bonjour les codeurs...Ti probléme à vous soumettre...Alors voilà je traite un log dans lequel se trouve des nom d'utilisateurs et d'autres infos dans duplication d'onglet et de ses controles [ par yvan777 ] Bonjour, Débutant dans le domaine de visual Basic, je n'arrive pas a dupliq Petit problème de naviguation dans les contrôles [ par veler ] BonsoirAlors voila,j'ai une form avec des enfants MDI.Dans cet MDI, j'ai un TabControl, avec un TabPage, et un TextBoxJ'aimerais pouvoir faire un Past détection de l'index d'un tabcontrol [ par fauve ] Salut,          Voila, j'utilise Microsoft Visual Basic 2005 Express Edition et je voudrais que lorsque la souris passe sur un onglet du TabControl problème avec TabControl & WebBrowser [ par fauve ] Salut,          J'ai crée un bouton et quand on cliques dessus il ajoute un nouveau TabPage à mon TabControl et dans ce TabPage, il ajoute un nouveau TabControl donner le Focus à un onglet ? [ par Sipat ] Bonsoir,Comment donner le Focus à un onglet  avec VB.NET 2003 ?Avec VB6 j'avais :TabControl.Tab = 0 pour le premier onglet, 1 pour le suivant...Mais a


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,36 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.