Dimentionnement du controle datagrid

saadouli7 Messages postés 36 Date d'inscription mardi 26 avril 2011 Statut Membre Dernière intervention 18 novembre 2011 - 19 oct. 2011 à 10:17
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 19 oct. 2011 à 14:29
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 les données à afficher :par fois j'ai 10 lignes alors autre fois j'ai seulement 2 lignes.je veut que la taille du controle change selon le nombre de lignes à afficher
j'arrive pas à résoudre ce problème.
est ce que quelq'un a une idée.
merci d'avance

8 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
19 oct. 2011 à 10:42
bonjour,

cela va dépendre de la police et de sa taille ===>> calcul arithmétique à faire sur la base de la hauteur physique du texte d'une ligne


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
19 oct. 2011 à 10:57
J'ignore si VB.Net t'offre, comme VB6, une fonction native pour cette détermination de taille d'un texte. Il est vraisemblable que oui.
Si, contre toute attente, cela ne t'est pas offert par VB.Net, tu auras toujours le recours de l'utilisation de la fonction GetTextExtentPoint32 de la librairie gdi32 de l'API de Windows.
Mais je suis à peu près certain que tu trouveras cela sous VB.Net (cherche du côté de system graphics).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
saadouli7 Messages postés 36 Date d'inscription mardi 26 avril 2011 Statut Membre Dernière intervention 18 novembre 2011
19 oct. 2011 à 11:16
Merci pour l'aide
réellement j'ai pas bien compris ce que vous m'avez proposé et j'arrive pas à résoudre ce problème. j'ai pensé qu'il y'a une propriété du datagrid qui fait ça.
cordialement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
19 oct. 2011 à 11:24
Non !
Cela ne dépend pas du seul nombre de lignes, mais également de la hauteur graphique qui, elle, dépend de la police et de sa taille.
Il y a donc de l'arithmétique à mettre en oeuvre. Elle devra de surcroît inclure la prise en compte d'autres aspects qui, eux, dépendent des paramètres de configuration (modifiables et donc pouvant être différents d'une machine à l'autre) : hauteur des bordures, etc ...

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 230
19 oct. 2011 à 11:38
Même si tu "figes" le rowheight en fonction de la police et de sa taille, pour "simplifier", il te faudra quand-même passer par des calculs (la hauteur des headers, les bordures, les traits de séparation, etc...).
Ce pourra être ainsi "bon" sur ta machine, mais cessera de l'être sur d'autres (si appli distribuée).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 oct. 2011 à 14:01
Bonjour,

J'avais en mon temps écrit une routine qui me redimensionnait un DataGrid.

Si tu le désires, je peux te donner ce code, mais attention:

Il est écrit en VB6 et s'applique aux seuls DataGrid (MSDATGRD.OCX) de VB6, il te faudra donc l'adapter si cela est possible, ne connaissant pas .NET je ne pourrais donc pas t'aider.

En gros, elle accepte la Grid à redimensionner, une hauteur maximale à ne pas dépasser et optionnel un tableau de contrôle Line (que tu définis dans ta form) pour déssier un rectangle autour de ta grille (de 1 à 4 côtés + couleur).

Il est assez vieux mais j'ai toujours des applis qui tournent avec. J'ai essayé de tenir compte de toutes les subtilités (Scrollbars, RecordSelectors et RecordButton), mais je ne garantis pas qu'il soit exempt de bug ou d'erreurs. C'est à tes risques et périls.

Dis-moi si tu veux que je te l'envoie.


Calade
0
saadouli7 Messages postés 36 Date d'inscription mardi 26 avril 2011 Statut Membre Dernière intervention 18 novembre 2011
19 oct. 2011 à 14:13
oui clade je veut le recevoir avec beaucoup de plaisir
et merci d'avance
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
19 oct. 2011 à 14:29
Alors voici:

Public Function BH_DGResize(ByRef DGGrid As Object, ByVal MaxHeight As Integer, _
                            Optional ByRef DGLines As Variant, _
                            Optional ByVal RowsCount As Long = -1, _
                            Optional ByVal WidthCenter As Single)
   Dim intVisibleRows As Integer, intOffset As Integer, intWidth As Integer, X As Integer
   On Error Resume Next
   
   Const LINE_TOP = 0
   Const LINE_RIGHT = 1
   Const LINE_BOTTOM = 2
   Const LINE_LEFT = 3
   
   DGGrid.HeadLines = IIf(DGGrid.ColumnHeaders, DGGrid.HeadLines, 0)
   intVisibleRows = ((MaxHeight / (DGGrid.RowHeight + 11)) - DGGrid.HeadLines)
   DGGrid.Height MaxHeight:                               DGGrid.VisibleRows intVisibleRows
   Select Case DGGrid.VisibleRows
      Case 0, 1, 2:                                         intOffset = 5     ' Ne pas mettre à zéro
      Case 3, 4, 5:                                         intOffset = 12
      Case Is < 10:                                         intOffset = 12
      Case Is > 9:                                          intOffset = 12    ' + (intVisibleRows / 10))
   End Select
   For X = 0 To DGGrid.Columns.Count
      intWidth = intWidth + IIf(DGGrid.Columns(X).Visible, (DGGrid.Columns(X).Width + 5), 5)
   Next
   DGGrid.Height = ((DGGrid.RowHeight + intOffset) * (BH_MinValue(intVisibleRows, DGGrid.VisibleRows) + DGGrid.HeadLines))
   If DGGrid.Row < 0 Then
      DGGrid.Height = ((DGGrid.RowHeight + intOffset) * BH_MaxValue(DGGrid.HeadLines, 1))
      DGLines(LINE_TOP).Visible False:                    DGLines(LINE_RIGHT).Visible False
      DGLines(LINE_BOTTOM).Visible False:                 DGLines(LINE_LEFT).Visible False
      DGGrid.Width = intWidth + IIf(DGGrid.RecordSelectors, 300, 0) '10)
   Else
      DGGrid.Height = ((DGGrid.RowHeight + intOffset) * (BH_MinValue(intVisibleRows, DGGrid.VisibleRows) + DGGrid.HeadLines))
      If DGGrid.VisibleRows > intVisibleRows Then DGGrid.Height = DGGrid.Height + 25
      If RowsCount >= 0 Then
         If DGGrid.ScrollBars dbgAutomatic Or DGGrid.ScrollBars dbgBoth Or DGGrid.ScrollBars = dbgVertical Then
            Select Case DGGrid.Columns.Count
               Case 0, 1, 2:                                intOffset = 5     ' Ne pas mettre à zéro
               Case 3, 4, 5:                                intOffset = 10
               Case Is < 10:                                intOffset = 17
               Case Is > 9:                                 intOffset = (15 + (DGGrid.Columns.Count / 10))
            End Select
            DGGrid.Width = intWidth + ((intOffset * DGGrid.VisibleCols) + 0) + IIf(DGGrid.RecordSelectors, 300, 10)
            If RowsCount >= DGGrid.VisibleRows Then
               DGGrid.Height MaxHeight:                   DGGrid.VisibleRows intVisibleRows
            End If
         End If
      Else
         DGGrid.Width = intWidth + IIf(DGGrid.VisibleRows < DGGrid.ApproxCount, 260, 0)
         DGGrid.Width = DGGrid.Width + IIf(DGGrid.RecordSelectors, 300, 0)
         DGGrid.ScrollBars = IIf(intVisibleRows < DGGrid.ApproxCount, dbgAutomatic, dbgNone)
      End If
      DGGrid.Height DGGrid.Height + IIf(DGGrid.HeadLines 0, 50, 5)
      If WidthCenter > 0 Then
         DGGrid.Left = ((WidthCenter - (DGGrid.Width + 100)) / 2)
      End If
      If Not IsMissing(DGLines) Then
         If UCase(TypeName(DGLines(0))) = "LINE" Then
'            DGLines(LINE_TOP).Visible True:                     DGLines(LINE_RIGHT).Visible True
'            DGLines(LINE_BOTTOM).Visible True:                  DGLines(LINE_LEFT).Visible True
            DGLines(LINE_TOP).X1 DGGrid.Left - 50:              DGLines(LINE_TOP).X2 DGGrid.Left + DGGrid.Width + 10
            DGLines(LINE_TOP).Y1 DGGrid.Top - 50:               DGLines(LINE_TOP).Y2 DGGrid.Top - 50
            DGLines(LINE_RIGHT).X1 = DGGrid.Left + DGGrid.Width + 20
            DGLines(LINE_RIGHT).X2 = DGGrid.Left + DGGrid.Width + 20
            DGLines(LINE_RIGHT).Y1 DGGrid.Top - 10:             DGLines(LINE_RIGHT).Y2 DGGrid.Top + DGGrid.Height + 50
            DGLines(LINE_BOTTOM).X1 DGGrid.Left - 50:           DGLines(LINE_BOTTOM).X2 DGGrid.Left + DGGrid.Width + 10
            DGLines(LINE_BOTTOM).Y1 = DGGrid.Top + DGGrid.Height + 50
            DGLines(LINE_BOTTOM).Y2 = DGGrid.Top + DGGrid.Height + 50
            DGLines(LINE_LEFT).X1 DGGrid.Left - 50:             DGLines(LINE_LEFT).X2 DGGrid.Left - 50
            DGLines(LINE_LEFT).Y1 DGGrid.Top - 10:              DGLines(LINE_LEFT).Y2 DGGrid.Top + DGGrid.Height + 50
         End If
      End If
   End If
End Function


Public Function BH_MaxValue(ByVal Value1 As Long, ByVal Value2 As Long) As Long
   BH_MaxValue = IIf(Value1 < Value2, Value2, Value1)
End Function

Public Function BH_MinValue(ByVal Value1 As Long, ByVal Value2 As Long) As Long
   BH_MinValue = IIf(Value1 > Value2, Value2, Value1)
End Function



J'ai essayé de virer le code perso' qui ne te sert à rien (surtout des appels à des fonctions persos que j'ai ajouté en dessous). Je t'avoue que je ne sais plus à quoi servent les paramètres RowsCount et WidthCenter, à toi de tester.
L'idéal serait de le tester avec VB6 pour en comprendre le fonctionnement mais je ne sais si c'est possible.
Si tu as des problèmes de compréhension fais-moi signe, mais je te le répète pour l'adaptation je ne connais pas .NET.

Have Fun

Calade
0