Today I thought that I would share one of my personal helper functions. One of the neat things about Sapien’s PowerShell Studio is that when you add a control, you also get some neat functions added to your code to help you populate and use the control. For example, when you add a DataGridView, Load-DataGridView and ConvertTo-DataGridView is added to your code. Load-DataGridView helps you load a grid view. ConvertTo-DataGridView helps you format the data.
I have my own ways of doing things at times and when what is provided does not do everything that I want, I code it myself. Below is my code for Set-DGV. I created this one to help me with word wrap and to control the order in which the columns appear. Take this code for example:
1 2 3 4 5 6 7 8 9 10 | $Info = Get-NetAdapter | Select-Object -Property Name, DNSSuffix, IPAddresses, SubnetMasks, Gateway, DNSServers, MACAddress, Status, MediaType, MediaConnectionState, FullDuplex, LastErrorCode, Speed
Set-DGV -DGV $datagridview1 ` -Data $Info ` -ColumnOrder Name, Gateway, FullDuplex ` -ColumnWidth 100, 100, 150, 200, 50, 50, 50 ` -EnableWordWrap Name, MacAddress ` -EnableRowAutoSize |
First I save the objects that I want into the variable $Info. I used Select-Object to remove the properties that I did not want to display. When using the Set-DGV function, you need to tell which DataGridView control you want to populate with the –DVG parameter. The –Data parameter contains the objects that you want to display. If there are specific columns that you want listed first, place them in order with –ColumnOrder. You can also specify the column width with the –ColumnWidth parameter. The arguments are positional starting with the first column. If you need word wrapping, use the –EnableWordWrap parameter. Its arguments are the property names that need word wrapped enabled. -EnableRowAutoSize will turn on row auto sizing for all rows.
This is close to the built in helper functions from Sapien, but it offers a few different features. Here is some sample output.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
| <# .SYNOPSIS Allows for rapid creation of a DataGridViews content.
.PARAMETER DGV This is the name of the DataGridView in your form that you want to populate.
.PARAMETER Data This is the object containing the information to be placed in the DataGridView.
.PARAMETER ColumnOrder The DataGridView will auto populate the columns. You can specify, by column name, the order that they should appear in. For Example, if you have an object with the properties AA, BB, CC, and DD and you wanted to display them in a different order, you would provide this parameter as follows:
-ColumnOrder DD, BB, AA, CC
.PARAMETER ColumnWidth Determines the width, in pixels, for each column. Provide a comma separated list in integers for each column. You do not need to provide a value for each column. The default width will be used.
.PARAMETER EnableWordWrap Provide the column names of any column that you want to enable Word Wrap on.
.PARAMETER EnableRowAutoSize This switch will allow the rows to dynamically grow in size to accommodate all information in a the cell.
.EXAMPLE $Script:Info = Get-NetAdapter | Select-Object -Property Name, DNSSuffix, IPAddresses, SubnetMasks, Gateway, DNSServers, MACAddress, Status, MediaType, MediaConnectionState, FullDuplex, LastErrorCode, Speed
Set-DGV -DGV $DGVTest1 ` -Data $Script:Info ` -ColumnOrder Name, Gateway, FullDuplex ` -ColumnWidth 100, 100, 150, 200, 50, 50, 50 ` -EnableWordWrap Name, MacAddress ` -EnableRowAutoSize
Gathers information from the Get-NetAdapter cmdlet and then filters the object to only the desired properties. Next, send to the Set-DGV cmdlet. The "Data" parameter is the name of the Windows form control for the DataGridView. "ColumnOrder" set the first 3 columns to "Name", "Gateway", "FullDuplex". The remainder of the columns will be in there default order. The "ColumnWidth" parameter is setting non-default width for the first 7 columns. "EnableWordWrap" is set on the two columns for the properties "Name" and "MacAddress" For Word wrap to work, the data needs spaces in it. This DGV is also allowed to resize the height of rows to fit the content.
.NOTES ============================================================================= Set-DGV Version 1.0 Copyright 2014, All rights reserved. ----------------------------------------------------------------------------- History: Version 1.0 Parameters available: - DGV - Data - ColumnOrder - ColumnWidth - EnableWordWrap - EnableAutoSize ----------------------------------------------------------------------------- Known Issues:
============================================================================= #> function Set-DGV { Param ( [Parameter(Mandatory = $true)] $DGV, [Parameter(Mandatory = $true)] $Data, [String[]]$ColumnOrder, [Int[]] $ColumnWidth, [String[]]$EnableWordWrap, [Switch]$EnableRowAutoSize ) # Clear the DGV. When the DGV refreshes, the data would otherwise # append causing repeat values. This will prevent that. For ($X = 0; $X -lt $DGV.Rows.Count; $X++) { $DGV.Rows.RemoveAt($X) $DGV.Rows.Clear() $DGV.Columns.Clear() } # Create a ArrayList to hold the sorted column names. $ColumnNameList = New-Object System.Collections.ArrayList # Get a list of all the property names. $Names = $Data | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name ForEach ($C in $Names) { $ColumnNameList.Add($C) } # Reorder the list if there is a preferred order for displaying the properties. For ($X = $ColumnOrder.count; $X -ge 0; $X--) { For ($Y = 0; $Y -lt $ColumnNameList.Count; $Y++) { If ($ColumnOrder[$X] -eq $ColumnNameList[$Y]) { # Standard swap algorythm. $Temp = $ColumnNameList[$X] $ColumnNameList[$X] = $ColumnOrder[$X] $ColumnNameList[$Y] = $Temp } } } # Display the column names in the DGV ForEach ($C in $ColumnNameList) { $ColumnCount = $DGV.ColumnCount + 1 $DGV.ColumnCount = $ColumnCount $DGV.Columns[$ColumnCount - 1].HeaderText = "$C" } # Set the column widths # To ensure that the amount of information sent to this option does not exceed # the number of properties, the maximum number of columns that can have # their widths modified is set to the number of properties in the object being # display. Then the number of column widths sent is evaluated. The lesser of # the 2 is used to determine how many column widths to modify. If ($ColumnWidth -ne $null) { $MaxWidth = $ColumnNameList.Count If ($ColumnWidth.Count -lt $MaxWidth) { $MaxWidth = $ColumnWidth.count } For ($X = 0; $X -lt $MaxWidth; $X++) { $DGV.Columns[$X].Width = $ColumnWidth[$X] } }
# Enable word Wrap #$DGV.DefaultCellStyle.WrapMode = 'True' If ($EnableWordWrap -ne $null) { For ($X = 0; $X -lt $EnableWordWrap.Count; $X++) { If ($EnableWordWrap[$X] -eq $ColumnNameList[$X]) { $DGV.DefaultCellStyle.WrapMode = 'True' } } } # Add the first row. $DGV.Rows.Add() # Get the number of rows to display $RowTotal = $Data.count # Set the current Row. $Row = 0 # Work with one instance one at a time. foreach ($Item in $Data) { # Determine the Row Number For ($X = 0; $X -lt $ColumnNameList.Count; $X++) { $DGV.Rows[$Row].Cells[$X].Value = $Item | Select-Object -ExpandProperty $ColumnNameList[$X] # Allow for row auto resize. If ($EnableRowAutoSize) { $DGV.AutoResizeRow($Row) } } # Add the next row. If ($Row -lt $Data.Count - 1) { $Row++ $DGV.Rows.Add() } } } # End: Function Set-DGV
|
Comments
in the Studio you can configure cells as buttons, images and other properties.
when i use the function it overwrites these settings,
maybe you have some idea how to avoid this?
thank you again
Sean