Gestion de l'affichage d'un TableLayoutPanel dans un MainForm

Résolu
damiengarnier Messages postés 8 Date d'inscription vendredi 3 avril 2009 Statut Membre Dernière intervention 16 avril 2009 - 15 avril 2009 à 16:12
 nediarawen - 17 mars 2013 à 19:22
Bonjour à tous et merci d'avance de prendre un peu de temps pour me venir en aide,

Je suis chargé de créer un assistant informatique de gestion commerciale. Ce programme réalisé sous Visual Studio 2008 Express permettra à l'utilisateur de consulter des graphiques statistiques de l'activité commerciale de la société.
J'ai déjà développé dans le passé des applications sous MS ACCESS mais j'ai décidé de me mettre à visual studio pour réaliser une application plus professionnelle. Le problème est que pas mal de choses change entre ACCESS et Visual studio concernant la programmation. Je poserai donc régulièrement des questions (j'espère le moins souvent possible, c'est en faisant qu'on apprend) tout au long du développement de mon application.

Voilà mon problème :

J'ai créer un formulaire MainForm. Dans ce dernier, j'ai inséré un MenuStrip permettant d'accéder à divers département de la société. Pour le moment, je m'intéresse seulement à la partie "Commercial".

Sur l'évènement "CommercialTableauDeBordCompletToolStripMenuItem.Click", je souhaite afficher les différents graphiques au sein de MainForm. Pour se faire, j'ai écrit le code suivant :

Public Class MainForm

    'Décalaration et instanciation d'une TableLayoutPanel
    Dim MainPanel As New TableLayoutPanel
 
Private Sub LoadMainPanel(ByVal NbColonnes As Integer, ByVal NbLignes As Integer)

Me.Controls.Add(MainPanel)
       
'Configuration graphique de MainPanel
        With MainPanel
            .Dock = DockStyle.Fill
            .ColumnCount = NbColonnes
            .RowCount = NbLignes
        End With

        Dim ColonnesStyles As TableLayoutColumnStyleCollection = MainPanel.ColumnStyles
        Dim LignesStyles As TableLayoutRowStyleCollection = MainPanel.RowStyles
        For Each style As ColumnStyle In ColonnesStyles
            style.SizeType = SizeType.Percent
            style.Width = 100% / NbColonnes
        Next
        For Each style As RowStyle In LignesStyles
            style.SizeType = SizeType.Percent
            style.Height = 100% / NbLignes
        Next

End Sub

Private Sub CommercialTableauDeBordCompletToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles CommercialTableauDeBordCompletToolStripMenuItem.Click
       
LoadMainPanel(2, 2)

        'Déclaration et instanciation des DataGridView
        Dim NewDataGridView1 As DataGridView = New DataGridView
        Dim NewDataGridView2 As DataGridView = New DataGridView
        Dim NewDataGridView3 As DataGridView = New DataGridView
        Dim NewDataGridView4 As DataGridView = New DataGridView

        'Ajout des DataGridView au MainPanel
        With MainPanel
            .Controls.Add(NewDataGridView1, 0, 0)
            .Controls.Add(NewDataGridView2, 0, 1)
            .Controls.Add(NewDataGridView3, 1, 0)
            .Controls.Add(NewDataGridView4, 1, 1)

        End With

        For i = 0 To 3
            Me.MainPanel.Controls(i).Anchor = AnchorStyles.Bottom _
                                             Or AnchorStyles.Left _
                                             Or AnchorStyles.Right _
                                             Or AnchorStyles.Top
        Next
End Sub

Étant en phase de test concernant la gestion de MainPanel, j'insère des DataGridView pour vérifier la bonne disposition des colonnes et lignes de MainPanel.
Je lance le débogage, je clique sur menu Commercial puis Tableau de bord complet et je devrais obtenir un quadrillage régulier de 2x2. Au lieu de cela, j'obtiens :

Je remarque plusieurs choses :
1 - Les colonnes ne sont pas de la même taille. Pourtant, dans le code, je demande que les colonnes soit de type pourcentage et qu'elles soient égales à 100/NbColonnes
2 - Idem que 1 mais pour les lignes
3 - La propriété Dock MainPanel étant sur Fill, MainPanel prend toute la place disponible mais la position Bottom n'est pas en dessous du MenuToolStrip mais tout en haut du formulaire (Voir cercle rouge).

J'ai pourtant moulte cherché au travers le forum de ce site et autres mais je ne trouve pas la solution.
Alors, à tous ceux qui auraient des élèments de solution, je vous remercie d'avance pour me les faire partager et j'espère que la résolution de ce problème aidera d'autres développeurs.

Bon développement à tous!

3 réponses

damiengarnier Messages postés 8 Date d'inscription vendredi 3 avril 2009 Statut Membre Dernière intervention 16 avril 2009
15 avril 2009 à 19:12
Et bien aujourd'hui aura été la journée de l'inspiration : J'ai résolu mes problèmes.
Voici le résultat pour ceux qui voudront s'en inspirer.

Public Class MainForm

    'Décalaration et instanciation d'une TableLayoutPanel
    Dim MainPanel As New TableLayoutPanel
 
Private Sub LoadMainPanel(ByVal NbColonnes As Integer, ByVal NbLignes As Integer)

'Ajout de MainPanel au MainFormPanel
    Me.MainFormPanel.Controls.Add(MainPanel)

'Configuration graphique de MainPanel
  With MainPanel
            .Dock = DockStyle.Fill
            .ColumnCount = NbColonnes
            .RowCount = NbLignes
            .CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset
  End With

  Dim i As Integer
  i = NbColonnes
  Do
    MainPanel.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 100.0! / NbColonnes))
    i = i - 1
  Loop Until i = 0

  Dim j As Integer
  j = NbLignes
  Do
    MainPanel.RowStyles.Add(New RowStyle(SizeType.Percent, 100.0! / NbLignes))
    j = j - 1
  Loop Until j = 0

End Sub

Private Sub CommercialTableauDeBordCompletToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CommercialTableauDeBordCompletToolStripMenuItem.Click

'Chargement de MainPanel
   LoadMainPanel(3, 3)

'Configuration graphique des contrôles appartenant à MainPanel
   Dim ControlsCollection As TableLayoutControlCollection = MainPanel.Controls()
   For Each Control As Control In ControlsCollection
       Control.Dock = DockStyle.Fill
   Next

End Sub

J'obtiens le résultat suivant :

Et voilà, j'espère que cela en aidera plus d'un.

Bon développement!
3
damiengarnier Messages postés 8 Date d'inscription vendredi 3 avril 2009 Statut Membre Dernière intervention 16 avril 2009
15 avril 2009 à 16:43
J'ai résolu le problème concernant la position de MainPanel (Problème n°3 du message précédent). C'est bête comme chou...
J'ai inséré en mode design un Panel dans mon formulaire et j'ai mis la propriété de celui-ci à Fill. Ensuite dans le code, j'insère MainPanel non pas dans le formulaire mais dans le panel que j'ai préalablement créé en mode design.
0
[^^happy10]
0
Rejoignez-nous