PowerShell Studio 2014 - DataGridView Sorting
When creating graphical tools with PowerShell Studio 2014 and using the DataGridView control, I often find myself looking for the following tip!
The DataGridView control provides a customizable table for displaying data. You can extend the DataGridView control in a number of ways to build custom behaviors into your applications. A DataView provides a means to filter and sort data within a DataTable. The following example shows how to sort a DataGridView by using a DataTable Object.
In this example, I’m using PowerShell Studio 2014 from SAPIEN, you can download a 45 days trial version here.
How to sort DataGridView ?
Using PowerShell Studio 2014, let’s create a simple GUI and add a DataGridView control
Add a DataGridView |
For test purpose, I will add some PowerShell code to load the list of processes currently running and the machine and send it to the DataGridView control:
$form1_Load = {
$Processes = Get-Process | Select-Object -Property Name, id, ws
Load-DataGridView -DataGridView $datagridview1 -Item $Processes
}
If you try to launch the tool, you’ll see the following. At this point we can’t sort anything yet.
Basic GUI |
Converting to a Database object
One of the requirement to allow the sorting feature is to convert the PowerShell Object to a [System.Data.Datatable] object.
Function ConvertTo-DataTable Thanks the guys at SAPIEN, they created a small function to do this: ConvertTo-DataTable
To load this function, open the snippets using the CTRL+K shortcut and select “Convert To Database”
Snippets |
ConvertTo-Datatable preview |
You can find the ConvertTo-Datatable here.
Convert PSObject to DataTable Now we need to convert the output of Get-Process to a DataTable object:
$form1_Load = {
$Processes = Get-Process | Select-Object -Property Name, id, ws
$ProcessesDT = ConvertTo-DataTable -InputObject $Processes
Load-DataGridView -DataGridView $datagridview1 -Item $ProcessesDT
}
Add an event ColumnHeaderMouseClick
Next, we need to add an event when the user click on one of the Column Header In the designer view, select your DataGridView and double click on the event called: ColumnHeaderMouseClick
ColumnHeaderMouseClick event (DataGridView Control) |
Finally add this piece of code, to enable the feature:
$datagridview1_ColumnHeaderMouseClick=[System.Windows.Forms.DataGridViewCellMouseEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.DataGridViewCellMouseEventArgs]
if ($datagridview1.DataSource -is [System.Data.DataTable])
{
$column = $datagridview1.Columns[$_.ColumnIndex]
$direction = [System.ComponentModel.ListSortDirection]::Ascending
if ($column.HeaderCell.SortGlyphDirection -eq 'Descending')
{
$direction = [System.ComponentModel.ListSortDirection]::Descending
}
$datagridview1.Sort($datagridview1.Columns[$_.ColumnIndex], $direction)
}
}
Sorting in action
Now let’s run the tool again and click on “Name” a couple of times for example, It will sort on this property.
Code Example
Finally, the code is available on GitHub or Technet Gallery
Leave a comment