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 :

vb.net - Modifier type colonne DataGridView


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut vb.net - Modifier type colonne DataGridView
    Bonjour à tous, Salut olsimare,

    Comment faire pour modifier (par code) le type d'une colonne dans un DtGridView, une fois qu'il est créé et rempli ?


    Merci à tous.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Pour préciser ma question, il s'agirait de récupérer dans un dataGridView les données depuis une datatable pour des questions de rapidité :

    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
    Public Sub Remplissage()
     
    Dim sr = New StreamReader(Main.strPath & "Colonnes.txt", System.Text.Encoding.Default)
            Do Until sr.Peek = -1
                Str = sr.ReadLine()
                Dim c0 = New DataColumn(Str)
                dtbl.Columns.Add(c0)
            Loop
     
            sr.Close()
     
            Dim sr = New StreamReader(StrFile, System.Text.Encoding.Default)
     
            Do Until sr.Peek = -1
                Str = sr.ReadLine()
                Main.SubChaine = Str.Split(Main.Delim)
                dtbl.Rows.Add(Main.SubChaine)
            Loop
     
            DGV.DataSource = dtbl
     
    End Sub

    Sauf que je dois affecter à ce dataGridView des colonnes particulières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub Colonnes()
     
            Dim sr = New StreamReader(Main.strPath & "Colonnes.txt", System.Text.Encoding.Default)
            Do Until sr.Peek = -1
                Str = sr.ReadLine()
                Dim c1 As New FormulaDGVColumn
                c1.HeaderText = Str
                Me.DGV.Columns.Add(c1)
            Loop
     
            sr.Close()
     
        End Sub
    Je me sens donc obliger de remplir ma DGV comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Dim sr = New StreamReader(StrFile, System.Text.Encoding.Default)
     
            Do Until sr.Peek = -1
                Str = sr.ReadLine()
                SubChaine = Str.Split(";")
                Me.DGV.Rows.Add(SubChaine)
            Loop
     
            sr.Close()
    Comment mélanger les 2 méthodes (Colonnes Perso + Données depuis une DataTable ?

    Merci.

  3. #3
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Re.

    Tu dois déclarer les colonnes de ton DGV avant d'alimenter le datasource (il n'est pas possible de changer le type d'une colonne existante) et positionner le datagridview.AutoGenerateColumns à False.

    Ensuite, tu dois faire pour chaque colonne le bind avec la source comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tacolonne.DataPropertyName = "LeNomDeLaColonneEnDatatable"
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Merci Olsimare, ca fonctionne.
    Seul soucis, comme mes colonnes personnalisées (que tu connais) contiennent des cellules personnalisées ayant une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, _
        ByRef cellStyle As DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As DataGridViewDataErrorContexts) As Object
     
    ...
     
    End Function
    Du coup, au lancement le DGV qui contient bien les données n'affiche que la première ligne (car le pointeur par défaut se trouve en cellule (0,0) et active une seul fois cette même fonction.)

    Il faudrait donc contourner cette fonction juste au lancement...

    Cdt.

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Citation Envoyé par House MD Voir le message
    Seul soucis, comme mes colonnes personnalisées (que tu connais) contiennent des cellules personnalisées
    Oui, enfin je les connais pas plus que ça ! Comme les autres lecteurs de ce post d'ailleurs (faut pas oublier que c'est un forum ).

    Je ne vois pas pourquoi ça ne fonctionnerait pas et je ne comprends pas cette histoire de pointeur. Qu'obtiens tu exactement ? Une seule ligne affichée ou plusieurs lignes dont seule la prémiére est alimentée correctement ?

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Le DataGridView est bien rempli mais seule la première ligne est affichée.
    Je sais qu'il est rempli car dès que je clique sur une cellule "vide" son contenu s'affiche.

    Ce phénomène provient de la fonction que je mentionnais :

    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
     
        Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, _
        ByRef cellStyle As DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As DataGridViewDataErrorContexts) As Object
     
            If Me.RowIndex < 0 Then
                Return Nothing
            End If
     
            Dim s As String = CStr(Me.Value)
     
            'Hors Saisie Formule
            If DocSaisie.boolFormula Then
                Return s
            End If
     
            If s = Nothing Then
                Return Nothing
            End If
     
            If s = "=" Then
                Return s
            End If
     
            If s.StartsWith("=") Then
     
                'Appel de la Fonction AttribVal()
                Dim StrCal As String = AttribVal(s, Me.RowIndex)
                Dim Evl As New Eval3.Evaluator
     
                Try
                    Return CStr(Evl.Parse(StrCal).value)
     
                    'Si Attribution de Valeur Impossible : Cellule Cible = Vide
                Catch ex As Exception
                    Me.Value = ""
                    MessageBox.Show("Formule erronée.")
                    Return Nothing
                End Try
            Else
                Return s
            End If
     
        End Function

    car si je la masque tout s'affiche normalement.

    Je pense que la première ligne est visible à cause de la cellule (0,0) qui est automatiquement (par défaut) sélectionnée au lancement du DGV.
    Il déclenche la sélection des autres cellules de la ligne (c'est ne fonction que j'ai faite) et ces sélections appellent la fonction ci-jointe qui retoune s.


    Comment faire ?
    Merci.

  7. #7
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Peut-être qu'en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim s As String = CStr(Me.Value)
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim s As String = CStr(value)
    Le Me.Value n'est peut être pas encore positionné d'où la tentative de prendre celui passé en paramétre.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Non, le problème ne vient pas de là.
    Il vient du fait qu'au moment où je transfère la dataTable au DGV :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.DGV.DataSource = TblDGV
    Cela n'appelle pas la fonction "GetFormattedValue", du coup aucun affichage n'a lieu.
    Si la première ligne est affichée, un fois encore, c'est simplement parce que le curseur se positionne par défaut sur cette ligne et déclenche, lui, cette fonction.

    La fonction marche bien, mais ne fonctionne que cellule à cellule, pas pour tout un DGV.

    Pour l'instant, pour contourner le problème, après l'affichage du formulaire j'active la 1ère cellule de chaque ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .DocActif.Show()
    For A As Integer = 0 To DocActif.DGV.RowCount - 1 
       .DocActif.DGV.Item(0, A).Selected = True
       .DocActif.DGV.Item(0, A).Selected = False
    Next

    ...

  9. #9
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Me.DGV.DataSource = TblDGV
    Me.DGV.Refresh
    Ca devrait le faire.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Non, ca ne marche pas (j'avais essayé).
    En fait Refresh() n'appelle pas la fonction GetFormatedValue.

    La seule chose à faire si c'est possible c'est de ne pas passer (au chargement) par cette fonction, de l'éviter (si je la commente, cela fonctionne.)

    Merci, Merci.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Bon, j'ai fini par la jouer comme ca :

    dans la fonction GetFormattedValue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Pour désactiver momentanéement GetFormattedVakue
    If DocSaisie.BoolDesAct = False Then
        Return value
    End If
    Dans le formulaire DocSaisie qui contient le DGV :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Pour que la GetFormattedValue soit réactivée :
    Private Sub DGV_CellClick...
        BoolDesAct = True
    End Sub
    Je laisse ce post encore une journée si qqn a une meilleure idée.

    Encore merci.

Discussions similaires

  1. Recupérer la colonne modifiée dans un datagridview
    Par psychosiffleur dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/02/2010, 16h26
  2. Modifier le style d'une colonne DATAGRIDVIEW
    Par auriol dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/02/2009, 00h26
  3. Comment masquer colonnes datagridview, vb.net?
    Par tssi555 dans le forum VB.NET
    Réponses: 5
    Dernier message: 18/08/2008, 14h18
  4. Modifier type colonne d'une table
    Par Gothico dans le forum WinDev
    Réponses: 2
    Dernier message: 28/02/2008, 16h21
  5. Modifier Type de colonnes
    Par klael dans le forum Paradox
    Réponses: 6
    Dernier message: 25/05/2007, 16h50

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