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

VB.NET Discussion :

Mise en forme cellules DGV pour certaine lignes ajoutées [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Mise en forme cellules DGV pour certaine lignes ajoutées
    Bonjour à tous,
    J'aimerais beaucoup avoir votre aide sur ce bout de code :
    J'aimerais que certaines cellules de mon dgv soit en Lecture seul en fonction du type de ligne que j'ajoute. Le type est récupéré en lisant la colonne Key2.

    Mon dgv contient bien 2 type de lignes "EQU" et "TAB" mais ce sont toutes les lignes qui passent en lecture seule, hors j'aimerais que ce soit uniquement les lignes "TAB".

    Aussi il semblerait que RowsAdded peut être levé une seule fois pour un ensemble de lignes, comment faire pour parcourir toutes les lignes nouvellement ajoutées (soit manuellement soit par programmation).

    Et pour finir je me demande si je ferait pas mieux de le faire dans le Cellformating ou ailleurs mais cette mise en forme est fonction de la valeur qui représente mon type de ligne qui elle même est définie lorsque je crée la ligne. Une fois crée ce type de ligne ne change pas.

    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
      Private Sub DataGridViewMain_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles DataGridViewMain.RowsAdded
     
            MessageBox.Show(String.Format("RowsAdded : {0} at RowIndex : {1}", e.RowCount, e.RowIndex))
            Dim view As DataGridView = CType(sender, DataGridView)
     
            Dim key2 As String = CStr(view.Rows(e.RowIndex).Cells(DicoColsEquipements.EnumCol.Key2).Value)
            Select Case key2
                Case "EQU"
     
                Case "TAB"
                    DataGridViewMain.Rows(e.RowIndex).Cells(DicoColsEquipements.EnumCol.Tableau_Repere).ReadOnly = True
                    DataGridViewMain.Rows(e.RowIndex).Cells(DicoColsEquipements.EnumCol.Désignation).ReadOnly = True
            End Select
     
     
        End Sub
    Merci beaucoup pour votre aide.

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Je ne connais pas la réponse à ta question mais voici comment je contournerais le problème.

    Je comprends dans ta question que si la valeur dans une colonne données est "TAB", il doit être impossible de modifier n'imùporte quelle cellule de cette ligne.

    Pour modifier une cellule, il faut y placer le focus ou la sélectionner. Il faut dont atteindre cette ligne, soit par le Click d'une de ses cellules dans mon exemple, soit en y déplaçant le "curseur".
    Lorsque qu'une ligne est ainsi désignée, je vérifie la valeur de sa cellule pouvant contenir "TAB" ou "EQU". Si la valeur est "TAB", je quitte la procédure sans aucun traitement. Il est ainsi impossible de modifier une cellule de cette ligne.

    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
     
    ' Avec l'événement CellMouseClick
        Private Sub DGV_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick
            Dim ColonneATester As Integer = ' ... ici l'indice de la colonne contenant peut-être "TAB"
            If DGV.Item(ColonneATester, e.RowIndex).Value = "TAB" Then
                Exit Sub
            End If
            ' On continue ici si modifications permises
       Sub
     
    ' ou mieux, avec l'événement RowEnter (fonctionne aussi avec le passage d'une ligne à l'autre avec les flèches du clavier, mais attention, il s'active aussi pendant le chargement du DGV)
     
        Private Sub DGV_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DGV.RowEnter
         Dim ColonneATester As Integer = ' ... ici l'indice de la colonne contenant peut-être "TAB"
         If  DGV.Item(ColonneATester, e.RowIndex).Value = "TAB" Then
                Exit Sub
            End If
            ' On continue ici si modifications permises
        End Sub
    ...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    e.RowCount contient le nombre de lignes ajoutées
    https://learn.microsoft.com/en-us/do...tframework-4.8

    e.RowIndex n'a pas exactement la même info selon que l'ajout de ligne se soit fait manuellement (lindex(igne ajoutée)+1) ou par programme (index(ligne ajoutée) d'après la remarque de sa doc.
    https://learn.microsoft.com/en-us/do...rk-4.8#remarks

    Sinon ton code devrait fonctionné en principe.
    (readonly ne marche que si la cellule est modifiable)

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Merci pour vos réponses.

    @Phil Rob : Je crains que cela ne me convienne pas. Le changement de propriété de mes cellules doit aussi être effectués lorsque je charge mon fichier datas dans le dgv, c'est à dire que la propriété en lecture seule, c'est pour l'exemple, mais il y aura d'autres mises en forme comme la hauteur des lignes "TAB", ainsi que la couleur, la taille de la police et surement d'autres choses. Hors si je le fait dans le dans le CellMouseClick ou le RowEnter, je verrais pas cette mise en forme.

    @umfred : Oui , je pense aussi que mon code aurait du fonctionner de prime abord mais ce n'est pas le cas et je ne sais pas encore pourquoi.


    Bon, j'avance, RowsAdded est levé durant le chargement de mes Datas dans le dgv via cette ligne de code (jusque là c'est normal vue que le chargement crée une ligne de mon dgv pour chaque ligne de MonBindingSource).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridViewMain.DataSource = MonBindingSource
    DataSource est bien exécuté qu'une seule fois, pas de soucis à ce niveau là. ce qui entraine les appels à RowsAdded suivant :
    1er appel : Key2="TAB", RowsCount=1, RowsIndex=0
    2eme appel : key2='EQU", RowsCount=11, RowsIndex=1

    Donc, seulement 2 appels pour les 12 lignes que comporte mon dgv (dont 4 lignes "TAB" et 8 lignes "EQU").

    Pourquoi seulement 2 appels ? Pourquoi mes 12 lignes se retrouve toutes en lecture seule ?. j'avoue que je ne comprends pas encore le fonctionnement de RowsAdded.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    2 appels parce qu'il y doit y avoir le 1er pour la création de la 1ère ligne ("formattage" des colonnes depuis le datasource) et le second pour l'ajout des données suivantes (à traiter dans une boucle donc).

    Une explication du fait que tout soit en lecture seul pourrait être que la source des données passe par le DataSource ? (sans le code dans RowsAdded, est-ce que les données sont modifiables ou pas)

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Oui umfred, sans le code dans RowsAdded les données sont bien modifiables.

    Bon, j'arrive à quelque chose de plus concluant en faisant ceci :

    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
     Private Sub DataGridViewMain_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles DataGridViewMain.RowsAdded
            MessageBox.Show(String.Format("RowsAdded : {0} at RowIndex : {1}", e.RowCount, e.RowIndex))
            Dim view As DataGridView = CType(sender, DataGridView)
     
            For i = e.RowIndex To e.RowIndex + e.RowCount - 1
                Dim Key2As String = CStr(view.Rows(i).Cells(DicoColsEquipements.EnumCol.Key2).Value)
                Select Case Key2
                    Case "EQU"
                        DataGridViewMain.Rows(i).Cells(DicoColsEquipements.EnumCol.Tableau_Repere).ReadOnly = False
                        DataGridViewMain.Rows(i).Cells(DicoColsEquipements.EnumCol.Désignation).ReadOnly = False
                        DataGridViewMain.Rows(i).Height = 20
                    Case "TAB"
                        DataGridViewMain.Rows(i).Cells(DicoColsEquipements.EnumCol.Tableau_Repere).ReadOnly = True
                        DataGridViewMain.Rows(i).Cells(DicoColsEquipements.EnumCol.Désignation).ReadOnly = True
                        DataGridViewMain.Rows(i).Height = 30
                End Select
            Next
        End Sub
    Il semblerait qu'il faille traiter tous les cas "EQU" et TAB". si je supprime la ligne de code dans "EQU", je me retrouve avec toutes les lignes en hauteur de 30, c'est très bizarre.

    Je ne clôture pas le sujet car ma dernière remarque montre que je suis très loin de maitriser ce qui se passe exactement et je m'attends à beaucoup d'autres surprise de ce genre.

    Mais merci beaucoup, ca me permet d'avancer.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    J'avais précisé dans une réponse précédente que e.count contenait le nombre de lignes ajoutées (donc implicitement que tu pouvais les "parcourir" pour en faire ce que tu veux)
    Si ta 1ère ligne est de type "TAB", il va appliquer la mise en forme (dimension) que tu lui donnes à toutes les autres, ce qui me semble logique.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/01/2023, 15h53
  2. [2010] Macro mise en forme cellules pairs à décaler (Pa s ligne entière)
    Par Mano2000 dans le forum Microsoft Office
    Réponses: 0
    Dernier message: 17/11/2015, 17h28
  3. [XL-2010] Macro pour mise en forme dans nouvelle feuille de lignes selectionnées
    Par leflohic dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2015, 19h00
  4. Réponses: 5
    Dernier message: 29/06/2014, 14h27
  5. selection d'une cellule sur une certaine ligne
    Par florent149 dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 20/07/2006, 17h37

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