begin process at 2012 02 17 02:52:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

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

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


 Information sur la source

Note :
Aucune note
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é :11 013 / 921

Auteur : chris_brabant

Ecrire un message privé
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) GARDER LA SÉLECTION DANS UN DATAGRID APRÈS LE TRI SUR UNE CO...
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSES PERMETTANT DE FAIRE "CLIGNOTER" LES COLONNES D'UN DA...
Source .NET (Dotnet) FONCTION POUR METTRE UN COMBOBOX EN READONLY SANS METTRE EXP...
Source .NET (Dotnet) CONTRÔLE CHECKBOX AVEC UNE PROPRIÉTÉ READONLY - VALABLE AUSS...
Source .NET (Dotnet) DATETIMEPICKER AVEC UNE PROPRIÉTÉ READONLY

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) EXPORTER LES IMAGES DE WORD ET D' EXCEL par Le Pivert
Source avec Zip Source avec une capture JEUX DE VERITÉ ET DE FIDELITÉ par billatosco
Source avec Zip IMAGELOARDER par vkitumaini
Source avec Zip Source avec une capture Source .NET (Dotnet) CREER UN CALENDRIER DE POCHE par Le Pivert
Source avec Zip RECHERCHE D'UN ENREGISTREMENT DANS UNE DATATABLE ET POSITION... par erdna

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) LECTEUR DE NEWS RSS COMPLET par Bilou47190
Source avec Zip Source avec une capture Source .NET (Dotnet) CRÉER, CONNECTER ET REMPLIR UNE BASE ACCESS par Le Pivert
Source .NET (Dotnet) DATATABLE EN MATRICE 2D par CGSI3
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION SIMPLE D'UNE BASE ACCESS par CGSI3
Source avec Zip Source avec une capture [VB6 BASE DE DONNÉE] DÉMO SQL SUR TABLEAU EXCEL + DATAGRID A... par Philippe734

Commentaires et avis

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é.

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

Datagrid column par column [ par kempo ] Bonjour, J'ai 5 arrays differents que je souhaiterai afficher dans chaque colonne! J'ai donc: textcol As New DataGridTextColumn() Mais je ne trouv type incompatible, datagrid [ par tajajtsidi ] bonjour, j'espère que vous êtes en bonne santé. bon, j'explique mon pb. j'ai chargé une datagrid a partir d'une base de donnée. cette ligne provoque datagrid et les champs textbox [ par almous ] bonjour à tous je developpe une application qui gere un parc de taxi.donc mon probleme est que dans la formpersonnel j'aimerai que si je click dans le ma requete n'affiche aucun resultat dans datagrid [ par karihadi ] bonjour j'aimerai afficher les pièces vendues avant une date que l'utilisateur peut choisir à l'aide d'un calendar dans un textbox et voici la requete Affichage Dans Datagrid View [ par Labon90 ] Bonjour à tous, Je suis en VB 2010... J'utilse un DataTable que je remplis avec une requête SQL. Je me sert de ce DataTable pour emplir un DatagridV erreur sous vb6 [ par superfri ] bjr à tous, j'ai mon application conçu sous vb6 avec l'objet ADODC et les datagrid, qui tourne bien sous xp, mais sous seven ou sous vista j'ai cette Problème avec le DataGrid [ par Calade ] Bonjour, Je rencontre un problème récurrent avec le contrôle DataGrid. Pour que l'on soit bien d'accord il s'agit dans la liste des composants de l'I dimentionnement du controle datagrid [ par saadouli7 ] bonjours, je travaille avec vb.net et j'ai un problème concernant le dimentionnement du datagrid. je veut que le contrôle datagrid redimentionne selon Afficher le résultat d'une procédure stockée avec parametre dans datagrid [ par abdweb ] Bonjours a tous, je developpe une application sous [b]VB6[/b] en utilisant sql server 2005. Peut on m'aider à executer une procedure stockée avec p Datagrid [ par touraco510 ] Bonjour à tous j'ai besoin d'aide et voici ma préoccupation: j'ai fait une application de gestion des journaliers dans une entreprise X avec VB 6.0.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales