Share via


Adding rows to datagridview by column names

Question

Thursday, November 5, 2015 12:37 PM | 1 vote

I have made this powershell code below, wich adds 2 rows to a datagridview. I do this with the statement:

$DataGridView_ServerName.Rows.Add("1", "2")

But I would like to use the column names while adding the data. so that I can move (position) my columns more easily in my datagridview:

$DataGridView_ServerName.Rows.Add($Column1="1", $Column2="2")

or

$DataGridView_ServerName.Rows.Add(ServerName="1", Description="2")

Is this possible?

Complete code:

#Define Form
$form1 = New-Object System.Windows.Forms.Form
$form1.Text = ""
$form1.Name = "form1"
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Location = New-Object System.Drawing.Point(10,10)
$form1.Size = New-Object System.Drawing.Size(1600,900)
$form1.WindowState = "Normal"
$form1.StartPosition = "CenterScreen"

#Definine DataGridView
$DataGridView_ServerName = New-Object System.Windows.Forms.DataGridView
$DataGridView_ServerName.AllowUserToAddRows = $false
$DataGridView_ServerName.AllowUserToDeleteRows = $false
$DataGridView_ServerName.Top = 10
$DataGridView_ServerName.Left = 10
$DataGridView_ServerName.Height = 100
$DataGridView_ServerName.Width = 210
$DataGridView_ServerName.ColumnHeadersVisible = $true
$DataGridView_ServerName.ColumnHeadersHeight = 20 
$DataGridView_ServerName.Enabled = $false
    
#Add Columns
$Column1 = New-Object System.Windows.Forms.DataGridViewTextboxColumn
$Column2 = New-Object System.Windows.Forms.DataGridViewTextboxColumn
        
$Column1.Width = 80
$Column2.Width = 80

$Column1.Name = 'ServerName'
$Column2.Name = 'Description'
        
$DataGridView_ServerName.Columns.Add($Column1)
$DataGridView_ServerName.Columns.Add($Column2)

$form1.Controls.AddRange(($DataGridView_ServerName))

#Add Rows
$DataGridView_ServerName.Rows.Add("1", "2")
$DataGridView_ServerName.Rows.Add("a", "b")

$form1.ShowDialog() 

All replies (6)

Thursday, November 5, 2015 1:05 PM ✅Answered | 1 vote

Hi Marco,

you can use a utility function to do this:

function Add-Server
{
    Param (
        $ServerName = "",
        $Description = ""
    )
    
    $DataGridView_ServerName.Rows.Add($ServerName, $Description)
}

#Define Form
$form1 = New-Object System.Windows.Forms.Form
$form1.Text = ""
$form1.Name = "form1"
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Location = New-Object System.Drawing.Point(10, 10)
$form1.Size = New-Object System.Drawing.Size(1600, 900)
$form1.WindowState = "Normal"
$form1.StartPosition = "CenterScreen"

#Definine DataGridView
$DataGridView_ServerName = New-Object System.Windows.Forms.DataGridView
$DataGridView_ServerName.AllowUserToAddRows = $false
$DataGridView_ServerName.AllowUserToDeleteRows = $false
$DataGridView_ServerName.Top = 10
$DataGridView_ServerName.Left = 10
$DataGridView_ServerName.Height = 100
$DataGridView_ServerName.Width = 210
$DataGridView_ServerName.ColumnHeadersVisible = $true
$DataGridView_ServerName.ColumnHeadersHeight = 20
$DataGridView_ServerName.Enabled = $false

#Add Columns
$Column1 = New-Object System.Windows.Forms.DataGridViewTextboxColumn
$Column2 = New-Object System.Windows.Forms.DataGridViewTextboxColumn

$Column1.Width = 80
$Column2.Width = 80

$Column1.Name = 'ServerName'
$Column2.Name = 'Description'

$DataGridView_ServerName.Columns.Add($Column1)
$DataGridView_ServerName.Columns.Add($Column2)

$form1.Controls.AddRange(($DataGridView_ServerName))

#Add Rows
Add-Server "1" "2"
Add-Server "a" "b"
$parsplat = @{ ServerName = "Name"; Description = "Desc" }
Add-Server @parsplat

$form1.ShowDialog()

Cheers,
Fred

Please note, that this requires either passing the GridView as an additional parameter, or - as in this example - custom designing the function for a single use where you know the variable name of the gridview.

There's no place like 127.0.0.1


Thursday, November 5, 2015 2:21 PM

Fred,

Thanks a lot, I see I can also use it as:

Add-Server -Description "Desc2" -ServerName "Name2"

Is there also a method to retrieve the data from a DataGridView by column name? Now I do it like this:

#objTextBox
$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Point(10,120)
$objTextBox.Size = New-Object System.Drawing.Size(130,20)
$form1.Controls.Add($objTextBox)

$objTextBox.Text = $DataGridView_ServerName.Rows[1].Cells[1].Value.ToString()

But I would like to use something like this:

$objTextBox.Text = $DataGridView_ServerName.Rows[1].Cells[Description].Value.ToString()

Thanks,

Marco


Thursday, November 5, 2015 2:43 PM | 1 vote

I found it by myself

$objTextBox.Text = $DataGridView_ServerName.Item("Description",1).Value

Marco


Thursday, November 5, 2015 3:48 PM

If we use a datatable all things become much easier including sorting.

#Define Form
$form1 = New-Object System.Windows.Forms.Form
$form1.Text = ""
$form1.Name = "form1"
$form1.Location = '10, 10'
$form1.Size = '600, 400'
$form1.StartPosition = 'CenterScreen'

$buttonAdd = New-Object System.Windows.Forms.Button
$form1.Controls.Add($buttonAdd)
$buttonAdd.Text = 'Add Row'
$buttonAdd.Location = '430,10'
$buttonAdd.add_Click({ AddRow 'ServerName' 'Added by buttoon' })

# Define DataGridView
$dgvServer = New-Object System.Windows.Forms.DataGridView
$form1.Controls.Add($dgvServer)
$dgvServer.ReadOnly = $true
$dgvServer.Location = '10,10'
$dgvServer.Size = '400,350'


# add a data table
$dt = New-Object System.Data.DataTable
$dgvServer.DataSource = $dt
[void]$dt.Columns.Add('ServerName')
[void]$dt.Columns.Add('Description')

#Add Rows
function AddRow($Server, $Description) {
    $row = $dgvServer.DataSource.NewRow()
    $row['ServerName'] = $Server
    $row['Description'] = $Description
    $dgvServer.DataSource.Rows.Add($row)
}
AddRow 'MyServer1' 'My new server'
AddRow 'MyServer2' 'My new server'
AddRow 'MyServer3' 'My new server'
AddRow 'MyServer4' 'My new server'

$form1.ShowDialog()

# get a table roow and clumn
$dt[0].ServerName

# enumnerate
$dt | %{ $_.ServerName }

# Export
$dt | Export-Csv file.csv

\(ツ)_/


Thursday, November 5, 2015 3:54 PM

Sorry - had to fix the code paste as it was pasted twice.

\(ツ)_/


Saturday, June 23, 2018 2:52 AM

Is there a way to change column width? I added the below in your code above but nothing changed. Thanks

$dgvServer.AutoSize = $true