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

ASP.NET Discussion :

Alimenter un datagridview déjà formaté avec un dataset


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut Alimenter un datagridview déjà formaté avec un dataset
    Bonjour,

    Après moultes recherches dans tous les sens en vain, voici mon problème :
    Je souhaite alimenter un datagridview par un dataset en formatant au préalable ses colonnes (chacune possédant ses propres propriétés (alignement, type, visible, etc...)).

    Le datatable est alimenté par une requête SQL d'une base Oracle.

    Lorsque que j'alimente mon datagridview avec le dataset, il me créé autant de nouvelles colonnes qu'en contient le datatable et bien sur, les données sont dans ces nouvelles colonnes (ne respectant pas le formatage). Les premières colonnes formatées selon la demande sont vides.

    J'ai bien essayé avec AutoGenerateColumns = false. Le résultat est que le datagridview contient le même nombre de ligne mais les cellules sont vides.

    Voici le type de code que j'utilise.

    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
     
            Dim myDT As New DataTable
            Dim strSql As String
     
            Format_DataGridView(DataGridView1)
     
            myDT.Rows.Clear()
            strSql = "Select champ1, champ2 From table" 
            myDT = ReadRecords(strSql)
     
            Dim Data = New DataSet
            Data.Tables.Add(myDT)
     
            DataGridView1.DataSource = Data
            DataGridView1.DataMember = myDT.TableName
    Y aurait-il un moyen d'alimenter les colonnes définies dans le datagridview simplement sans devoir faire un datagridview.rows.add pour chaque ligne du datatable ?
    Ou alors, est ce que je prend pas le problème dans le mauvais sens ?

    Merci de votre aide.

  2. #2
    Expert confirmé 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
    Par défaut
    les données sont dans ces nouvelles colonnes (ne respectant pas le formatage)
    Pas grave, il suffit de gérer l'event CellPainting
    http://msdn.microsoft.com/en-us/libr...lpainting.aspx

    Suivant la colonne, tu peux par exemple :
    • ne rien faire et et laisser "e.Handled" à false (ce qui donnera le rendu standard),
    • changer le "e.Value" (ton formattage) et laisser "e.Handled" à false,
    • simplement "peindre" le fond en gardant "e.Value" inchangé et laisser "e.Handled" à false,
    • soit tracer complétement la cellule à la mano et mettre "e.Handled" à true.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Bonjour,

    Tout d'abord, merci de prendre le temps de me répondre.

    changer le "e.Value" (ton formattage) et laisser "e.Handled" à false,
    Bon les évents sur cellpainting sont encore un peu obscurs pour moi. Mais si je comprend bien, il faudrait que pour chaque cellule que je redéfinisse mon formatage ?

    Je voyais plutôt le programme fonctionné de la façon suivant : au chargement du formulaire, je formate le datagridview une seule fois
    Ensuite, à chaque refresh du datagridview, il n'y a plus qu'à alimenter les colonnes.

    Aurais tu un exemple ?
    sachant que mon formatage s'effectue de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim myTextBox As System.Windows.Forms.DataGridViewTextBoxColumn
    ' Formatage de la colonne de type texte
    myTextBox = New System.Windows.Forms.DataGridViewTextBoxColumn
    With myTextBox
        .Name = "champ1"
        .Width = 100
        .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        .Visible = True
    End With
    pDGView.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {myTextBox})
    Dans le même style, certaines cellules peuvent être typées en checkbox...

  4. #4
    Expert confirmé 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
    Par défaut
    Mais si je comprend bien, il faudrait que pour chaque cellule que je redéfinisse mon formatage ?
    CellPainting est appelé pour chaque cellule, mais le tracé s'effectuera acevc un code qui ne dépend que de la colonne de la cellule traitée.

    Si tu utilises régulièrement des DGV, Cellpainting est incontournable, par exemple pour tracer des lignes avec des couleurs de fond différentes, pour changer la couleur de la fonte de nombre négatifs, pour mettre un blanc comme séparateur de millliers, ...

  5. #5
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Ok ça marche nickel.

    Bon je dois dire qu'au début, je n'étais pas super chaud pour l'utilisation du CellPainting mais les différentes solutions de contournement que j'utilisais revenais au même et j'ai fini par comprendre son fonctionnement.

    Pour ceux que ça pourrait intéresser d'avoir des checkbox dans un datagridview, voici mon code :

    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
     
    ' Formatage de la colonne de type case Ã* cocher
    Dim RectCheckBox As New Rectangle(e.CellBounds.X + 1, e.CellBounds.Y + 2 _
                                    , e.CellBounds.Width - 4, e.CellBounds.Height - 5)
     
    Try
        e.PaintBackground(e.ClipBounds, True)
     
        If e.Value Is Nothing OrElse e.Value = "N" Then
            ControlPaint.DrawCheckBox(e.Graphics, RectCheckBox, ButtonState.Normal)
        Else
            ControlPaint.DrawCheckBox(e.Graphics, RectCheckBox, ButtonState.Checked)
        End If
     
        e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus)
        e.Handled = True
     
    Finally
    End Try
    en gérant l'évènement CellClick du datagridview, on peut modifier la valeur du checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If e.ColumnIndex = DataGridView.Columns("colonne").Index AndAlso e.RowIndex >= 0 Then
        If CBool(DataGridView.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) = True Then
            DataGridView.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False
        Else
            DataGridView.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = True
        End If
    End If

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/08/2011, 19h41
  2. Remplissage d'un datagridView avec un DataSet
    Par Hyoga95 dans le forum C#
    Réponses: 17
    Dernier message: 01/04/2010, 16h28
  3. Alimenter un Datagridview avec un dataset
    Par Job dans le forum Windows Forms
    Réponses: 0
    Dernier message: 19/01/2010, 10h53
  4. Réponses: 2
    Dernier message: 07/10/2009, 19h20
  5. remplir un datagridview avec un dataset
    Par Yogy dans le forum C#
    Réponses: 8
    Dernier message: 28/02/2008, 10h55

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