IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

CheckBox non clicable


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 17
    Points
    17
    Par défaut CheckBox non clicable
    Hello tout le monde,

    je travaille sur une appli winform qui gère l'éclairage d'un bâtiment. Le département design m'a fourni une jolie image que je dois utiliser pour allumer/éteindre (lumière grisée / lumière jaune). J'ai donc customisé le control checkBox avec cette image afin d'utiliser la propriété checked pour définir l'état de mes lumières.

    Viens s'ajouter à ça une notion de droits, car ne peut allumer/eteindre une lumière qu'un utilisateur authentifié.

    Pour gérer ça, j'utilise la propriété Enabled des checkBox. J'ai donc une checkBox visible mais non clicable si on n'est pas correctement authentifié. Le soucis est que je gère également l'état des lumières (quelle lumière est allumé dans quelle pièce) et pour les utilisateurs qui ne sont pas autorisé, le fait de mettre la checkBoxe .Enabled = false la rend grise même si l'état de la checkBoxe = true -> la lumière jaune s'affiche mais le fait qu'elle soit disable la rend grise.

    Y a t'il un moyen de rendre une checkBoxe non clicable sans pour autant devoir la désactiver? Ou est-ce que quelqu'un vois un meilleur moyen de gérer les états et le click en fonction des droits?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    WPF est nettement plus adapté pour faire ce genre de chose...

    En WinForms, je pense que la solution la plus simple (si j'ose dire) est d'overrider la méthode OnPaint, et de tenir compte des différentes propriétés (Checked, Enabled, etc) pour dessiner ce que tu veux (lumière éteinte/allumée/désactivée)

    Comment as-tu implémenté ton contrôle actuel ? Tu overrides déjà OnPaint ?

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut overrides the click
    Bonjour ribeheld
    rappel MSDN Doc fr:
    La méthode OnClick autorise également les classes dérivées à gérer l'événement sans y attacher de délégué. Cette technique est recommandée pour gérer l'événement dans une classe dérivée.
    Remarques à l'attention des héritiers :

    Lors de la substitution de OnClick dans une classe dérivée, veillez à appeler la méthode OnClick de la classe de base de manière à ce que les délégués inscrits reçoivent l'événement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' This is a custom TextBox control that overrides the OnClick method
    ' to allow one-click selection of the text in the text box.
     
    Public Class SingleClickTextBox
        Inherits TextBox
     
        Protected Overrides Sub OnClick(ByVal e As EventArgs)
            Me.SelectAll()
            MyBase.OnClick(e)
        End Sub
     
     
    End Class
    ce qui precede est la reponse à ta question:
    Y a t'il un moyen de rendre une checkBoxe non clicable sans pour autant devoir la désactiver?
    Voici comment.
    Dans le cas pose c.à.d Allumer(unlock.png) /Eteindre lumieres(lock.png) dans l'evenement OnPaint sans passer par Enable.
    L'event Check/Unchech est en fait declencher par l'event Click .
    Il suffit de passer par une prop intermediare EnableClickCheck (on evite ainsi la prop Enable et on profite pour activer/desactiver le Click lui meme suivant la valeur de notre boolean):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    'custom control herite de  CheckBox
    Imports System.ComponentModel
     
    Public Class CustomControlCheck
    	Inherits CheckBox
    	'prop boolean
    	Private m_EnableClickCheck As Boolean = False
    	Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    		MyBase.OnPaint(e)
     
    		'Ajoutez ici votre code de dessin personnalisé
    		If Me.CheckState = Windows.Forms.CheckState.Checked Then
    			'draw lumiere "on"
    			Dim cl As Rectangle = e.ClipRectangle
    			e.Graphics.DrawImageUnscaled(My.Resources.Unlock, Me.DisplayRectangle)
    		ElseIf Me.CheckState = Windows.Forms.CheckState.Unchecked Then
    			'draw lumiere "off"
    			e.Graphics.DrawImageUnscaled(My.Resources.Lock, Me.DisplayRectangle)
    		End If
    	End Sub
    	'overrides event click
    	Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
    		If Me.m_EnableClickCheck Then 'activer le click
    			MyBase.OnClick(e)
    		End If
    		'desactiver le click car MyBase.OnClick(e)n'est pas appelee
    	End Sub
    	'pour etre visible dans l'inspecteur
    	<Browsable(True), Description("Active/Desactive le Click Check/Uncheck")> _
    	Public Property EnableClickCheck() As Boolean
    		Get
    			Return m_EnableClickCheck
    		End Get
    		Set(ByVal value As Boolean)
    			m_EnableClickCheck = value
    		End Set
    	End Property
     
    End Class
    'Forme de test
    Public Class Form1
     
    	'bouton autorisation ou  ce que tu veux comme gestion
    	Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    		Me.CustomControlCheck1.EnableClickCheck = Not Me.CustomControlCheck1.EnableClickCheck
     
    	End Sub
     
    End Class
    a toi d'ameliorer le dessin........
    bon code...............

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Une solution simple consisterait à utiliser une PictureBox et une CheckBox, l'image de la PictureBox dépendant de la propriété Checked de la checkbox et la PictureBox étant toujours Enabled.

    On peut éventuellement créer un UserControl basé sur un Panel intégrant CheckBox + PictureBox.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous,

    tout d'abord désolé pour le retard, j'ai dû m'absenter pour des raisons professionnelles et je viens de me remettre dans le bain.

    Je vais vous répondre dans l'ordre :

    Oui tomlev j'en suis conscient mais je ne peux malheureusement pas migrer l'application à ce stade. Je subit les choix de mon prédécesseur...

    MABROUKI, j'avais encore un petit espoir d'éviter d'en arriver là. Bien que j'aime ta solution, j'ai utilisé la méthode de Graffito et je jongle avec l'affichage de ces 2 controles. Mes checkbox étant déjà créées dynamiquement il me semblait plus évidant d'ajouter les PicturBox étant donné que j'avais déjà fait le gros du travail sur les checkBox.

    Merci à vous pour votre aide.

    Bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Mise à jour mysql avec une checkbox non checké
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/08/2006, 16h45
  2. [W3C] Liens non clicable sous FF (ok sous IE) ?
    Par laurentdusseau dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/05/2006, 18h55
  3. Réponses: 2
    Dernier message: 24/05/2006, 15h20
  4. [VBA][Excel]CheckBox non editable
    Par Pollux dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/01/2006, 10h03
  5. Fenêtre non clicable
    Par zan001 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 11/11/2005, 02h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo