Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

REDIMENSIONNER LES COLONNES D'UN CONTRÔLE DATAGRID D'APRÈS SON CONTENU


Information sur la source

Catégorie :Trucs & Astuces Source .NET ( DotNet ) Classé sous : datagrid, column, resize Niveau : Initié Date de création : 30/11/2006 Date de mise à jour : 30/11/2006 13:31:40 Vu / téléchargé: 8 420 / 785

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Cette fonction permet d'ajuster la largeur des colonnes d'un contrôle DataGrid en fonction de leur contenu : entête de la colonne, contenu des enregistrements, en fonction de la police de caractères.

Pré-requis :
- il faut créer un TableStyle pour la DataTable associée à la grille en tant que DataSource.
- il faut créer un GridColumnStyle pour chaque colonne à afficher dans la grille, avec une taille (Width) > 0

Comportement :
- s'il n'y a pas de TableStyle associé à la grille pour DataSource, une exception est levée.
- si une colonne ne possède pas de GridColumnStyle, elle est ignorée lors du redimensionnement.
- si une colonne possède un GridColumnStyle avec une taille (Width) égale à 0, elle est ignorée lors du redimensionnement.

- fonctionne pour les DataGridTextBoxColumnStyle et les DatagridBoolColumnStyle, quel que soit le type de donnée de la colonne (Int16, Int32, String, Decimal, Double, etc...)
- la DataSource de la grille, peut être un DataView pointant sur un DataTable, un DataTable, un DataSet avec un des DataTable qu'il contient.

Jetez un coup d'oeil sur l'image en début.
 

Source

  • Private Sub DataGridColumnAutoResize(ByRef oDataGrid As DataGrid)
  • Dim ds As DataSet
  • Dim dt As DataTable
  • Dim dw As DataView
  • Dim row As DataRow
  • Dim c As DataColumn
  • Dim i As Integer
  • Dim v() As Object
  • Dim o As Object
  • Dim maxcolsize() As Single
  • Dim sg As Single
  • Dim col_font As Font
  • Dim header_font As Font
  • Dim g As Graphics
  • Dim s As String
  • Dim tmp_sz As SizeF
  • Dim nbcol As Integer = -1
  • Dim nbgcs As Integer = -1
  • Dim ColumnResizedIndexes() As Integer = Nothing
  • Dim GridColumnStyleResizedIndexes() As Integer = Nothing
  • ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  • ' les colonnes dont la largeur (width) a été positionnée à 0 auparavant sont considérées
  • ' comme masquées et sont laissées telles quelles
  • ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  • ' la source de données doit être une Datatable, un Dataview ou un DataSet
  • If TypeOf oDataGrid.DataSource Is DataTable Then
  • dt = CType(oDataGrid.DataSource, DataTable)
  • ElseIf TypeOf oDataGrid.DataSource Is DataView Then
  • dw = CType(oDataGrid.DataSource, DataView)
  • dt = dw.Table
  • ElseIf TypeOf oDataGrid.DataSource Is DataSet Then
  • ds = CType(oDataGrid.DataSource, DataSet)
  • dw = Nothing
  • dt = ds.Tables(oDataGrid.DataMember)
  • Else
  • Throw New Exception("DataGridColumnAutoResize : la source de données pour n'est pas valide.")
  • Exit Sub
  • End If
  • Dim tabname As String = dt.TableName
  • If Not oDataGrid.TableStyles.Contains(tabname) Then
  • Throw New Exception("DataGridColumnAutoResize : le TableStyle '" + tabname + "' n'existe pas.")
  • Exit Sub
  • End If
  • g = oDataGrid.CreateGraphics()
  • i = 0
  • For Each c In dt.Columns
  • If oDataGrid.TableStyles(tabname).GridColumnStyles.Contains(c.ColumnName) Then
  • nbgcs += 1
  • If oDataGrid.TableStyles(tabname).GridColumnStyles(nbgcs).Width > 0 Then
  • nbcol += 1
  • ReDim Preserve ColumnResizedIndexes(nbcol)
  • ColumnResizedIndexes(nbcol) = i
  • ReDim Preserve GridColumnStyleResizedIndexes(nbcol)
  • GridColumnStyleResizedIndexes(nbcol) = nbgcs
  • End If
  • End If
  • i += 1
  • Next
  • ReDim maxcolsize(nbcol)
  • header_font = oDataGrid.TableStyles(tabname).HeaderFont
  • ' la taille max de chaque colonne est initialisée avec la taille des entêtes
  • nbcol = 0
  • For Each i In GridColumnStyleResizedIndexes
  • tmp_sz = g.MeasureString(oDataGrid.TableStyles(tabname).GridColumnStyles(i).HeaderText, _
  • header_font)
  • maxcolsize(nbcol) = tmp_sz.Width * (1 + (2 / tmp_sz.Width)) ' formule à la con ...
  • nbcol += 1
  • Next
  • ' on tient enfin compte des données contenues dans la source de données liée au Datagrid
  • For Each row In dt.Rows
  • nbcol = 0
  • If (Not (row.RowState = DataRowState.Deleted)) AndAlso (Not (row(0) Is DBNull.Value)) Then
  • v = row.ItemArray
  • i = 0
  • For Each o In v
  • If [Array].IndexOf(ColumnResizedIndexes, i) <> -1 Then
  • Select Case [Type].GetTypeCode(o.GetType())
  • Case TypeCode.String
  • s = o
  • Case TypeCode.DateTime
  • s = CStr(o) ' conversion DateTime vers String, en enlevant l'heure
  • Case Else
  • s = o.ToString
  • End Select
  • col_font = oDataGrid.Font
  • tmp_sz = g.MeasureString(s, col_font)
  • sg = tmp_sz.Width * (1 + (2 / tmp_sz.Width)) ' formule à la con ...
  • If maxcolsize(nbcol) < sg Then
  • maxcolsize(nbcol) = sg
  • End If
  • nbcol += 1
  • End If
  • i = i + 1
  • Next
  • End If
  • Next
  • nbcol = 0
  • For Each i In GridColumnStyleResizedIndexes
  • oDataGrid.TableStyles(tabname).GridColumnStyles(i).Width = maxcolsize(nbcol)
  • nbcol += 1
  • Next
  • End Sub
    Private Sub DataGridColumnAutoResize(ByRef oDataGrid As DataGrid)
        Dim ds As DataSet
        Dim dt As DataTable
        Dim dw As DataView
        Dim row As DataRow
        Dim c As DataColumn
        Dim i As Integer
        Dim v() As Object
        Dim o As Object
        Dim maxcolsize() As Single
        Dim sg As Single
        Dim col_font As Font
        Dim header_font As Font
        Dim g As Graphics
        Dim s As String
        Dim tmp_sz As SizeF
        Dim nbcol As Integer = -1
        Dim nbgcs As Integer = -1
        Dim ColumnResizedIndexes() As Integer = Nothing
        Dim GridColumnStyleResizedIndexes() As Integer = Nothing

        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' les colonnes dont la largeur (width) a été positionnée à 0 auparavant sont considérées
        ' comme masquées et sont laissées telles quelles
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        ' la source de données doit être une Datatable, un Dataview ou un DataSet
        If TypeOf oDataGrid.DataSource Is DataTable Then
            dt = CType(oDataGrid.DataSource, DataTable)
        ElseIf TypeOf oDataGrid.DataSource Is DataView Then
            dw = CType(oDataGrid.DataSource, DataView)
            dt = dw.Table
        ElseIf TypeOf oDataGrid.DataSource Is DataSet Then
            ds = CType(oDataGrid.DataSource, DataSet)
            dw = Nothing
            dt = ds.Tables(oDataGrid.DataMember)
        Else
            Throw New Exception("DataGridColumnAutoResize : la source de données pour n'est pas valide.")
            Exit Sub
        End If

        Dim tabname As String = dt.TableName

        If Not oDataGrid.TableStyles.Contains(tabname) Then
            Throw New Exception("DataGridColumnAutoResize : le TableStyle '" + tabname + "' n'existe pas.")
            Exit Sub
        End If

        g = oDataGrid.CreateGraphics()

        i = 0
        For Each c In dt.Columns
            If oDataGrid.TableStyles(tabname).GridColumnStyles.Contains(c.ColumnName) Then
                nbgcs += 1
                If oDataGrid.TableStyles(tabname).GridColumnStyles(nbgcs).Width > 0 Then
                    nbcol += 1
                    ReDim Preserve ColumnResizedIndexes(nbcol)
                    ColumnResizedIndexes(nbcol) = i
                    ReDim Preserve GridColumnStyleResizedIndexes(nbcol)
                    GridColumnStyleResizedIndexes(nbcol) = nbgcs
                End If
            End If
            i += 1
        Next
        ReDim maxcolsize(nbcol)

        header_font = oDataGrid.TableStyles(tabname).HeaderFont

        ' la taille max de chaque colonne est initialisée avec la taille des entêtes
        nbcol = 0
        For Each i In GridColumnStyleResizedIndexes
            tmp_sz = g.MeasureString(oDataGrid.TableStyles(tabname).GridColumnStyles(i).HeaderText, _
                header_font)
            maxcolsize(nbcol) = tmp_sz.Width * (1 + (2 / tmp_sz.Width)) ' formule à la con ...
            nbcol += 1
        Next

        ' on tient enfin compte des données contenues dans la source de données liée au Datagrid
        For Each row In dt.Rows
            nbcol = 0
            If (Not (row.RowState = DataRowState.Deleted)) AndAlso (Not (row(0) Is DBNull.Value)) Then
                v = row.ItemArray
                i = 0
                For Each o In v
                    If [Array].IndexOf(ColumnResizedIndexes, i) <> -1 Then
                        Select Case [Type].GetTypeCode(o.GetType())
                            Case TypeCode.String
                                s = o
                            Case TypeCode.DateTime
                                s = CStr(o) ' conversion DateTime vers String, en enlevant l'heure
                            Case Else
                                s = o.ToString
                        End Select
                        col_font = oDataGrid.Font
                        tmp_sz = g.MeasureString(s, col_font)

                        sg = tmp_sz.Width * (1 + (2 / tmp_sz.Width)) ' formule à la con ...
                        If maxcolsize(nbcol) < sg Then
                            maxcolsize(nbcol) = sg
                        End If
                        nbcol += 1
                    End If
                    i = i + 1
                Next
            End If
        Next

        nbcol = 0
        For Each i In GridColumnStyleResizedIndexes
            oDataGrid.TableStyles(tabname).GridColumnStyles(i).Width = maxcolsize(nbcol)
            nbcol += 1
        Next

    End Sub

Conclusion

Le redimensionnement ne fonctionne pas forcément bien si vous avez créé des ColumnStyle personnalisé, avec ComboBox, ou DateTimePicker, etc....
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

30 novembre 2006 13:31:40 :
mise à jour de l'apercu

Commentaires et avis

signaler à un administrateur
Commentaire de Benouille le 07/03/2007 09:55:47

g.MeasureString(s, col_font)

pas mal pas mal ...

quelle est l'utilité de la formule à la con?
        tmp_sz = g.MeasureString(s, col_font)
        sg = tmp_sz.Width * (1 + (2 / tmp_sz.Width)) ' formule à la con ...
et entre nous soit dit, si le commentaire dit effectivement ce que c'est (une formule à la con donc), il eut été plus utile de dire le pourquoi du besoin de ce petit pourcentage (dégressif en plus apperemment) ajouté.

signaler à un administrateur
Commentaire de chris_brabant le 20/03/2009 09:09:13

Bonjour, et désolé de répondre deux ans après !
ca pourra servir à quelqu'un d'autre peut-être ...

la "formule à la con" sert à AUGMENTER légèrement la largeur de l'entête de colonne par rapport à la taille du texte qu'elle contient (ca n'est donc pas dégressif).
La raison ? si on ne fait pas ca, l'entête n'apparait pas complètement, le dernier caractère au moins est toujours "rogné". Ca doit être dû, à mon avis, au fait qu'un espace est automatiquement ajouté par le contrôle DATAGRID AVANT et APRES le texte dans l'entête de colonne. Donc Graphic.MeasureString ne suffit pas.
De plus, je ne sais pas comment récupérer cette valeur en temps réel, donc j'ai déterminé la "formule à la con" de manière empirique en faisant des essais (par dichotomie en quelque sorte).

Faites l'essai sans la "formule à la con", et vous verrez la différence.

Voilà voilà

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

liste déroulante dans un datagrid [ par elfnoir ] bonjour a tous, je galere depuis plusieur jour sur un datagrid j'aimerai savoir comment on rempli la liste déroulante integré a un datagridmerci d'ava control grid ou datagrid [ par lanja ] Bonjour,J'ai juste une petite question concernant le(s) contrôle grid ou datagrid:comment fait-on pour inclure un controle combobox ou case à cocher d Datagrid [ par Christophe ] Lorsque je saisie un texte dans un TextBox avec un retour chariot (touche ENTREE), et qu'ensuite je le copie dans un datagrid.A la place du retour cha liste déroulante et datagrid [ par g.hamel ] Comment activer un e liste déroulante intégrée associée à un buttondabs un controle datagridex: datagrid1.columns(2).button=truele click sur le bouton imprimer un datagrid [ par valerie ] BonjourJe voudrais imprimer un datagrid qui est lié a une base de données contenant plus de 700 champs.Merci Urgent : Affichage d'un fichier txt dans un Datagrid [ par Raf ] Bonjouyr,comment faire pour lire un fichier txt qui contient 10 champs différents et afficher son contenu dans un Datagrid de 10 colonnes.Merci pour v datagrid et list [ par delphine ] Bonjouraujourd'ui mon problème est double :je travaille avec une relation vb-acces via ado ou odbc (cela dépend) quoiqu'il en soit j'ai crée une datag Datagrid 1 [ par MSI ] Bonjour,Soit un Datagrid dans la fenêtre de mon application.Je voudrais que lorsque je clique dans une cellule s'inscrive ets'enregistre un caractère, Datagrid 2 [ par MSI ] Sur le Datagrid de mon application je dois pouvoir ajouter desenregistrements. Je l'ai donc parametré en fonction.Lorsque j'ajoute un enregistrement l


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 3,432 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.