Using PowerShell to Databind a Combobox with a Value and some Text

This post provides an example of using PowerShell to databind a combobox with a value and some text.

Creating a combobox in Powershell and adding an item to it is a relatively trivial task:

$combobox = New-Object System.Windows.Forms.ComboBox
$combobox.Items.add("alkane")

The text of the selected combobox can be obtained like so:

$combobox.Text

This is a combobox in its most simplistic form. The trouble is, I’m from an ASP.Net background and it’s often handy to bind a value (the hidden reference to the selected item – usually a primary key integer) AND some text (the value that the user sees in the combobox – the ‘friendly’ name).  This requires a bit more leg work to implement and can be done by using a datatable, adding data to the datatable, and binding this datatable to our combobox like so:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][System.Windows.Forms.Application]::EnableVisualStyles()

#create a form
$form = New-Object System.Windows.Forms.Form

#create a datatable to bind to our combobox
$datatable = New-Object system.Data.DataTable
		
#Define Columns
$col1 = New-Object system.Data.DataColumn "Value",([string])
$col2 = New-Object system.Data.DataColumn "Text",([string])

#add columns to datatable
$datatable.columns.add($col1)
$datatable.columns.add($col2)
		
#Create a row
$datarow1 = $datatable.NewRow()

#Enter data in the row
$datarow1.Value = "Example Value 1"
$datarow1.Text = "Example Text 1"

#Add the row to the datatable
$datatable.Rows.Add($datarow1)

#Create another row
$datarow2 = $datatable.NewRow()

#Enter data in the row
$datarow2.Value = "Example Value 2"
$datarow2.Text = "Example Text 2"

#Add the row to the datatable
$datatable.Rows.Add($datarow2)

#create a combobox
$combobox = New-Object System.Windows.Forms.ComboBox		
$combobox.Add_SelectedIndexChanged({
		#output the selected value and text
		write-host $combobox.SelectedItem["Value"] $combobox.SelectedItem["Text"]
})

#clear combo before we bind it
$combobox.Items.Clear()

#bind combobox to datatable
$combobox.ValueMember = "Value"
$combobox.DisplayMember = "Text"
$combobox.Datasource = $datatable

#add combobox to form
$form.Controls.Add($combobox)	

#show form
[void]$form.showdialog()