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 :

Clignoter une image dans un DGV


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut Clignoter une image dans un DGV
    Bonjour,

    J'arrive à rajouter des images qui se trouve dans une ListImage directement dans une colonne de type image de mon DGV. Maintenant je souhaite pouvoir faire clignoter certaine de mes images en fonction de certain critere comme l'acquittement ou pas d'une ligne ou alors en fonction du résultat d'une certain colonne.

    Je souhaite que pendant 500ms, avoir mon image, et ensuite pendant 500ms ne rien avoir (c'est-à-dire, la couleur de fond de la cellule en temps normal).

    Voila la procédure que j'ai réalisé mais qui marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Sub ClignoterImageDansDGV()
            For i As Integer = 0 To DataGridView1.RowCount - 1
                If DataGridView1.Rows(i).Cells(4).EditedFormattedValue = "1" And DataGridView1.Rows(i).Cells(0).Value = Not Nothing Then
                    DataGridView1.Rows(i).Cells(0).Value = Nothing
                ElseIf DataGridView1.Rows(i).Cells(4).EditedFormattedValue = "1" And DataGridView1.Rows(i).Cells(0).Value = Nothing Then
                    DataGridView1.Rows(i).Cells(0).Value = imgListPrio.Images(0)
                End If
            Next
        End Sub
    Elle est ensuite utilisé dans un timer avec un intervalle de 500ms !!


    PS: Déjà le Nothing de ma procédure n'est pas adapté car il m'affiche une croix !!

    Merci d'avance pour vos suggestions !!

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    J'aurai aussi savoir comment réaliser un bon clignotement dans le sens politiquement bien programmé car mes procédures ne sont pas vraiment politiquement bien programmé mais plutôt politiquement bien farfelu.

  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
    bonjour dragondumond

    En matiere de "politique" sache une bonne fois pour toutes ,comme l'as dit Machaiviel, que seuls les interets comptent et qu'il faut faire la politique de l'heure.....Les romains en leur temps disait : le Capitole (romain siege du Senat) est proche de la Roche Tarpeinne (ou l'on jette les condamnes à Rome)....

    Bref tu peux utiliser l'event CellValueChanged qui trappe tous les changements de valeur qui surviennent dans les cellules du DGV...

    Voici un code ou :

    -Un list de 10 persons est cree (le prop SNumber est init . à "1" pour tous)...
    -le dgv est bindee au list.
    -une col. image est cree danq le DGV
    -puis 10 image(pris d'un controle listimage) sont ajoutes au dgv
    -un timer est demarre ensuite qui change la valeur du prop SNumber de "1" à "0" (et vice-versa) en prenant un row au hasard sur les 10...
    -l'image dans la ligne correspondante apparait et disparait toutes les 500ms...

    Evidemment le timer est un simulateur ...............

    code du class Person exemple avec son List(of Person):
    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
     
     
    Class Person
        Public Sub New(ByVal fn As String, ByVal ln As String, ByVal sn As String)
            FName = fn
            LName = ln
            SNumber = sn
        End Sub
        Public Property FName() As String
        Public Property LName() As String
        Public Property SNumber() As String
    End Class
    Class Persons
        Inherits List(Of Person)
        Dim p As Person
        Public Sub New()
     
     
            For i As Integer = 1 To 10
     
                p = New Person("FName" + i.ToString(), "LName" + i.ToString(), "1")
     
                Me.Add(p)
            Next
     
        End Sub
    End Class
    code du simple form d'utilisation:
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    'ajouter :
    '-un dgv
    '-un timer
    '-un listimage
     
    Public Class Form1
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim l As Persons = New Persons()
            Dim bds As BindingSource = New BindingSource()
            bds.DataSource = l
            Me.dgv.DataSource = bds
     
            Dim cell As DataGridViewImageCell = New DataGridViewImageCell
            cell.ImageLayout = DataGridViewImageCellLayout.Zoom
            cell.ValueIsIcon = False
            Dim col As DataGridViewImageColumn = New DataGridViewImageColumn(True)
            col.DefaultCellStyle.NullValue = Nothing
            col.CellTemplate = cell
            col.Name = "Image"
            dgv.Columns.Add(col)
            For i As Integer = 0 To l.Count - 1
                dgv.Rows(i).Cells("Image").Value = ImageList1.Images(i)
            Next
            Timer1.Enabled = True
            Timer1.Interval = 500 '500 ms
     
        End Sub
        ' ce  random simule le changement de valeur de la prop
        ' SNumber de "1" à "0" si elle est à "1" et vice-versa 
        ' en prenant une row parmi les 10
     
        Dim rnd As Random = New Random
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim numCellAge As Integer = rnd.Next(0, dgv.RowCount - 1)
            If dgv.Rows(numCellAge).Cells("SNumber").Value = "1" Then
                dgv.Rows(numCellAge).Cells("SNumber").Value = "0"
     
            ElseIf dgv.Rows(numCellAge).Cells("SNumber").Value = "0" Then
                dgv.Rows(numCellAge).Cells("SNumber").Value = "1"
     
            End If
        End Sub
     
     
     
        ' l'event CellValueChanged trappe les changements de valeur apporte 
        ' à toute cellule du dgv 
        Private Sub dgv_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellValueChanged
            Dim i As Integer = e.RowIndex
            Dim j As Integer = e.ColumnIndex
     
            If dgv.Columns(j).Name = "SNumber" Then ' si col SNumber => on apelle ClignoterImageDGV
                ClignoterImageDGV(i, j)
            End If
            'sinon d'autres traitements eventuels sur cet event.....
        End Sub
        Public Sub ClignoterImageDGV(ByVal i As Integer, ByVal j As Integer)
     
            If dgv.Rows(i).Cells(j).EditedFormattedValue = "0" Then
                dgv.Rows(i).Cells("Image").Value = Nothing
            Else
                dgv.Rows(i).Cells("Image").Value = ImageList1.Images(i)
            End If
     
        End Sub
     
     
    End Class
    'For i As Integer = 0 To DataGridView1.RowCount - 1
    '          If DataGridView1.Rows(i).Cells(4).EditedFormattedValue = "1" And DataGridView1.Rows(i).Cells(0).Value = Not Nothing Then
    '              DataGridView1.Rows(i).Cells(0).Value = Nothing
    '          ElseIf DataGridView1.Rows(i).Cells(4).EditedFormattedValue = "1" And DataGridView1.Rows(i).Cells(0).Value = Nothing Then
    '              DataGridView1.Rows(i).Cells(0).Value = imgListPrio.Images(0)
    '          End If
    '      Next
     
     
    'Private Sub dgv_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
     
    '    If e.RowIndex >= 0 And e.ColumnIndex >= 0 Then
     
    '        Select Case dgv.Columns(e.ColumnIndex).Name
     
    '            Case "PassedImage"
    '                If dgv.Rows(e.RowIndex).Cells("HiddenPassed").Value Then
    '                    e.CellStyle.BackColor = Color.Green
    '                    dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ImageList1.Images(e.RowIndex)
    '                Else
    '                    e.CellStyle.BackColor = Color.Red
    '                    dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ImageList1.Images(e.RowIndex)
    '                End If
     
    '            Case "LogDate"
    '                dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = FormatDateTime(dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, DateFormat.ShortTime)
     
    '            Case Else
     
    '        End Select
    '    End If
     
    'End Sub
    bon code....

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Il y a un peu de la triche de l'air je trouve, l'idée est de mettre une colonne a coté qui décide s'il y a eu clignotement ou pas pour faire marché la procédure Clignotement. Perso, j'aurai aimé avoir une condition pour savoir si une cellule contient une image ou pas, c'est beaucoup plus simple si c'est réalisable.

    Sinon je voulais te remercié pour ta structure de ta class (person et persons), j'utilise beaucoup des mini class pour faire des choses sympa et a chaque fois je me tapé a faire les classes en dur suivi de la déclaration a l'ancien, blablabla en tous je connaisse pas et je suis ravi de voir qu'il y a plus simple.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    J'ai aussi un souci est que lorsque je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgv.Rows(i).Cells("Image").Value = Nothing
    J'obtiens pas une cellule vide mais une cellule avec une case petite case blanche avec une croix rouge sur un fond gris autour de ma case blanche.

    ps: Alors que je veux juste un clignotement entre mon image et le fond du DGV d'origine !!

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par dragondumond Voir le message
    ... Perso, j'aurai aimé avoir une condition pour savoir si une cellule contient une image ou pas, c'est beaucoup plus simple si c'est réalisable.

    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Sub ClignoterImageDGV(ByVal i As Integer)
            If dgv.Rows(i).Cells("Image").Value Is Nothing Then dgv.Rows(i).Cells("Image").Value = ImageList1.Images(i) Else dgv.Rows(i).Cells("Image").Value = Nothing
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    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
    re
    Maintenant je souhaite pouvoir faire clignoter certaine de mes images en fonction de certain critere comme l'acquittement ou pas d'une ligne ou alors en fonction du résultat d'une certain colonne.
    J'ai repondu à la question posee ...
    Maintenant ca a l'air de devenir de plus en plus nebuleux ..

    Il y a un peu de la triche de l'air je trouve
    C'est toi qui triche avec toi-meme parce que tu ne sais exactement ce que tu veux faire.....

    Perso, j'aurai aimé avoir une condition pour savoir si une cellule contient une image ou pas, c'est beaucoup plus simple si c'est réalisable.
    La belle affaire ,ca n'as aucun sens mais ca peut se faire en 2 lignes dans timer_tick
    code revu:
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    'ajouter :
    '-un dgv
    '-un timer
    '-un listimage
     
    Public Class Form2
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
        End Sub
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim l As Persons = New Persons()
     
     
            'LA CROIX APPARAIT
            dgv.DefaultCellStyle.NullValue = Nothing
     
            Dim bds As BindingSource = New BindingSource()
            bds.DataSource = l
            Me.dgv.DataSource = bds
     
            Dim cell As DataGridViewImageCell = New DataGridViewImageCell
            cell.ImageLayout = DataGridViewImageCellLayout.Zoom
            cell.ValueIsIcon = False
            Dim col As DataGridViewImageColumn = New DataGridViewImageColumn(True)
            col.CellTemplate = cell
            col.Name = "Image"
            dgv.Columns.Add(col)
     
            For i As Integer = 0 To l.Count - 1
                dgv.Rows(i).Cells("Image").Value = ImageList1.Images(i)
            Next
            Timer1.Enabled = True
            Timer1.Interval = 500 '500 ms
     
        End Sub
        ' raise l'event CellValueChanged par timer 
        ' en prenant une row parmi les 10
     
        Dim rnd As Random = New Random
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim numRow As Integer = rnd.Next(0, dgv.RowCount - 1)
            ClignoterImageDGV(numRow)
        End Sub
     
     
     
        Public Sub ClignoterImageDGV(ByVal i As Integer)
     
            If dgv.Rows(i).Cells("Image").Value IsNot Nothing Then
                dgv.Rows(i).Cells("Image").Value = Nothing
            Else
                dgv.Rows(i).Cells("Image").Value = ImageList1.Images(i)
            End If
     
        End Sub
     
     
    End Class

    J'obtiens pas une cellule vide mais une cellule avec une case petite case blanche avec une croix rouge sur un fond gris autour de ma case blanche
    Il faut mettre ceci pour ton dgv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          DataGridView1.DefaultCellStyle.NullValue = Nothing
    bon code...

  8. #8
    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
    Alors que je veux juste un clignotement entre mon image et le fond du DGV d'origine !!
    Utilise l'événement CellPainting() pour Contrôler le tracé :
    • pour les cellules "Images" à vide, retracer complétement la cellule (Un Fillrect pour le fond, 2 drawline pour les bordures Top et Left comprises) et e.handled=true,
    • pour les autres cellules, e.handled=false.
    Sinon, faire clignoter une cellule de DataGridView ne me parait pas une si bonne idée. Pour mettre en évidence des lignes, on peut pazr exemple mettre en rouge la couleur du fond des RowHeaderCell (là ou se trouve le curseur indiquant la CurrentRow).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Grâce au post de MABROUKI, j'arrive maintenant a réaliser un clignotement entre une image et Nothing qui renvois toujours la même image (Croix rouge dans un carré blanc) mais maintenant ma condition marche et le clignotement est assuré.
    Il y a deux solutions qui me viennent à l'esprit, la première est de faire une image spécial en plus dans ma liste d'image avec une couleur genre fond du DGV, il me suffirait alors de jonglé entre les deux images sans avoir besoin du Nothing. La seconde serai de laisser le Nothing et de suivre l'idée de graffito qui consiste a maquiller l'image du Nothing !!

    Je vous remercie d'avance pour vos suggestions !!

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Alors enfin de compte le clignotement ce fera entre deux images, l'une clair et l'autre un peu plus sombre. Donc il y a pas de souci mais j'avais une petite questions hors sujet. Pour l'instant mes images ont un fond d’écran blanc, j'aurai voulu savoir s'il était possible de réaliser une procédure qui modifie le fond d’écran d'une image, par exemple, change le blanc en gris ???

  11. #11
    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 consiterait à utiliser des images de type Gif avec un fond transparent et de changer la backColor du control ou de la cellule sur laquelle apparait l'image.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

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

Discussions similaires

  1. Ajouter une image dans un DGV
    Par dragondumond dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/06/2013, 18h15
  2. Comment copier une image dans le presse papier.
    Par cprogil dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2003, 16h54
  3. Peut on mettre une image dans une BD MySQL ?
    Par maddog2032 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/07/2003, 17h18
  4. Une image dans un composant ?
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 12h28
  5. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 08h44

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