mercredi 24 octobre 2018

Grille de données

L'objet "DataGridView" est un contrôle à la fois très intéressant et beaucoup plus complexe que les autres contrôles que nous avons vu précédemment. J'ai donc réaliser un exemple avec un maximum de chose intéressante, tout en gardant un niveau que j’espère abordable pour un maximum de monde.

La façon simple et rapide de réaliser un DataGridView est d'utiliser la commande "Out-GridView". Par exemple : Get-ADComputer -Filter 'Name –Like "*"' | Out-GridView

C'est bien mais si je veux l’intégrer dans un formulaire ce n'est pas très beau, et le comportement n'est pas forcement adapté. Pour pouvoir intégrer correctement le contrôle dans un formulaire, j'utilise donc l'objet "DataGridView". Celui-ci me permet d'utiliser ses paramètres pour obtenir le résultat et la forme que je souhaite. Par exemple : $gridA1.ReadOnly permet d'autoriser (ou non) la modification des données.


 
#Fenêtre.
$formA = New-Object Windows.Forms.Form
$formA.Size = New-Object Drawing.Point 400,230
$formA.Text = "DataGridView"
$formA.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240)

#Taille de la fenêtre.
$largeurA = $formA.width
$hauteurA = $formA.height

#DataGrid - Options générales.
#SelectionMode -> CellSelect, FullRowSelect, FullColumnSelect,
#SelectionMode -> RowHeaderSelect, ColumnHeaderSelect.
#ScrollBars ----> None, Horizontal, Vertical, Both.
$gridA1 = New-Object System.Windows.Forms.DataGridView
$gridA1.Location = New-Object Drawing.Point -1,-1
$gridA1.Size = New-Object Drawing.Point ($largeurA-14),($hauteurA-72)
$gridA1.ScrollBars = "Vertical"  
$gridA1.ReadOnly = $false
$gridA1.AutoSize = $false
$gridA1.GridColor = "Black"
$gridA1.AllowUserToResizeRows = $true
$gridA1.BorderStyle = [System.Windows.Forms.BorderStyle]::None
$gridA1.BackgroundColor = [System.Drawing.Color]::FromArgb(255,240,240,240)
$gridA1.DefaultCellStyle.SelectionBackColor = [System.Drawing.Color]::FromArgb(255,94,191,212)
$gridA1.SelectionMode = "FullRowSelect"
$gridA1.MultiSelect = $false

#DataGrid - Style de l'entête.
#ColumnHeadersHeightSizeMode -> EnableResizing, DisableResizing, AutoSize.
#ColumnHeadersBorderStyle ----> Custom, Single, Raised, Sunken, None.
$gridA1.RowHeadersVisible    = $false
$gridA1.ColumnHeadersVisible = $true
$gridA1.ColumnHeadersHeightSizeMode = "DisableResizing"
$gridA1.EnableHeadersVisualStyles = $false
$gridA1.ColumnHeadersDefaultCellStyle.BackColor = [System.Drawing.Color]::FromArgb(255,44,40,109)
$gridA1.ColumnHeadersDefaultCellStyle.ForeColor = "White"
$gridA1.ColumnHeadersDefaultCellStyle.Alignment = "MiddleCenter"
$gridA1.ColumnHeadersBorderStyle = "Single"

#DataGrid - Ajouter les colonnes.
[void]$gridA1.Columns.Add((New-Object System.Windows.Forms.DataGridViewTextBoxColumn))
[void]$gridA1.Columns.Add((New-Object System.Windows.Forms.DataGridViewTextBoxColumn))
[void]$gridA1.Columns.Add((New-Object System.Windows.Forms.DataGridViewComboBoxColumn))

#DataGrid - Ajouter le texte des entêtes de colonnes.
$gridA1.Columns[0].Name = "Titre"
$gridA1.Columns[1].Name = "Editeur"
$gridA1.Columns[2].Name = "Nb Volume"

#DataGrid - Données pour la ComboBox.
$gridA1.Columns[2].DataSource = @("1","2","3","4","5","6","7","8","9","10","11","12")
$gridA1.Columns[2].FlatStyle  = [System.Windows.Forms.FlatStyle]::Flat

#DataGrid - Options des colonnes.
#SortMode -> NotSortable, Automatic, Programmatic.
foreach($column in $gridA1.Columns)
 {
   $column.SortMode     = "NotSortable"
   $column.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill
 }

#DataGrid - Alignement.
#Alignment -> NotSet, TopLeft, TopCenter, TopRight, MiddleLeft, MiddleCenter,
#Alignment -> MiddleRight, BottomLeft, BottomCenter, BottomRight.
$gridA1.Columns[2].DefaultCellStyle.Alignment = "MiddleCenter"

#DataGrid - Taille de colonne.
#En mode "Fill", il faut laisser une colonnes sans taille fixe.
$gridA1.Columns[2].Width = 80

#DataGrid - Ajouter les lignes de données.
[void]$gridA1.Rows.Add("Jumbor"      ,"Kana"      ,"2" )
[void]$gridA1.Rows.Add("Battle Game" ,"Doki-Doki" ,"2" )
[void]$gridA1.Rows.Add("Re:Teen"     ,"Doki-Doki" ,"3" )
[void]$gridA1.Rows.Add("Imotep"      ,"Kioon"     ,"10")
[void]$gridA1.Rows.Add("Pluto"       ,"Kana"      ,"8" )

#Bouton - Annuler.
$buttonA1 = New-Object Windows.Forms.Button
$buttonA1.Location = New-Object Drawing.Point ($largeurA-102),($hauteurA-67)
$buttonA1.Size = New-Object Drawing.Point 80,23
$buttonA1.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
$buttonA1.BackColor = [System.Drawing.Color]::FromArgb(255,225,225,225)
$buttonA1.Text = "Quitter"
$buttonA1.Add_Click({ $formA.Close() })

#Bouton - Valider.
$buttonA2 = New-Object Windows.Forms.Button
$buttonA2.Location = New-Object Drawing.Point ($largeurA-187),($hauteurA-67)
$buttonA2.Size = New-Object Drawing.Point 80,23
$buttonA2.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
$buttonA2.BackColor = [System.Drawing.Color]::FromArgb(255,225,225,225)
$buttonA2.Text = "OK"
$buttonA2.Add_Click({
                      #Index de la 1er cellule selectionné.
                      $r = $gridA1.SelectedCells[0].RowIndex
                      $c = $gridA1.SelectedCells[0].ColumnIndex
                     
                      #Nombre de ligne de données.
                      $n = ($gridA1.RowCount - 1)
                     
                      #Si la ligne sélectionné est valide.
                      if (($r -ne $n) -and (![string]::IsNullOrEmpty($r)))
                        {
                          #Afficher les données.
                          $titre   = $gridA1.SelectedCells[0].Value
                          $editeur = $gridA1.SelectedCells[1].Value
                          $volume  = $gridA1.SelectedCells[2].Value
                          Write-Host $titre "-" $editeur "-" $volume "volume(s)."
                        }
                      else
                        {
                          #Sinon afficher une erreur.
                          Write-Host "La valeur sélectionné n'est pas valide."
                        }
                   })

#Lier.
$formA.Controls.Add($gridA1)
$formA.Controls.Add($buttonA1)
$formA.Controls.Add($buttonA2)

#Events.
$formA.Add_Load({
                    $gridA1.ClearSelection()
                    $formA.Activate()
               })

$formA.Add_Resize({
                    #Ajuste la position des contrôles lorsque la fenêtre change de taille.
                    $gridA1.Size       = New-Object Drawing.Point ($formA.width-14) ,($formA.height-72)
                    $buttonA1.Location = New-Object Drawing.Point ($formA.width-102),($formA.height-67)
                    $buttonA2.Location = New-Object Drawing.Point ($formA.width-187),($formA.height-67)
                 })

#Afficher.
[void]$formA.ShowDialog()