title: Create drop down menu for every item in a list
body: <p>Ok, so I am trying to create a drop down menu for every item in "$Cots" and move it slightly down. I have the basics of it, well the basic creation for it, but don't know how exactly I would call it using the "controls.add(whatever)" and how the information would link up.</p>
  
  <p>My Code:</p>
  
  <pre><code>$Script = @{}; $COTS = @{}
  Function CheckProgram {
      Param ($Program)
  
      # Create Object
      $OutputObj = New-Object -TypeName PSobject
  
      $OutputObj | Add-Member -MemberType NoteProperty -Name Name -Value $Program.Product
      $OutputObj | Add-Member -MemberType NoteProperty -Name LatestVersion -Value $Program.("Latest Version")
      $OutputObj | Add-Member -MemberType NoteProperty -Name SilentInstallSwitches -Value $Program.("Silent Install Switches")
      $OutputObj | Add-Member -MemberType NoteProperty -Name InstallerPath -Value $Program.("Installer Path")
      $OutputObj | Add-Member -MemberType NoteProperty -Name RegistryIdentifier -Value ($Program.Product -replace "[0-9]" -replace "  ","*")
  
      IF (Test-Path $Program.("Installer Path")) {
          $OutputObj | Add-Member -MemberType NoteProperty -Name InstallerPathValid -Value "Yes"
      } ELSE {
          $OutputObj | Add-Member -MemberType NoteProperty -Name InstallerPathValid -Value "No"
      }
      $OutputObj | Add-Member -MemberType NoteProperty -Name ProductArchitectures -Value $Program.Architecture
  
      # Populate temporary variable with infomation from registry
      $InstalledProgram = ($COTS.Programs | Where {$_.DisplayName -like $OutputObj.RegistryIdentifier})
      IF ($InstalledProgram) {
          IF ($InstalledProgram.PSPath -like "*Wow6432Node*"){
              $OutputObj | Add-Member -MemberType NoteProperty -Name InstalledArchitecture -Value "x64"
          } ELSE {
              $OutputObj | Add-Member -MemberType NoteProperty -Name InstalledArchitecture -Value "x32"
          }
          $OutputObj | Add-Member -MemberType NoteProperty -Name Installed -Value "Yes"
          $OutputObj | Add-Member -MemberType NoteProperty -Name CurrentVersion -Value $InstalledProgram.DisplayVersion
          $OutputObj | Add-Member -MemberType NoteProperty -Name UninstallString -Value $InstalledProgram.UninstallString
      } ELSE {
          $OutputObj | Add-Member -MemberType NoteProperty -Name Installed -Value "No"
      }
  
      # Determine what action should be taken
      IF ($OutputObj.installed -eq "Yes") {
          IF ($OutPutObj.CurrentVersion -le $OutPutObj.LatestVersion) {
              $OutputObj | Add-Member -MemberType NoteProperty -Name InstallAction -Value "Update"
              $OutPutObj.InstallOptions = @("Install","Update","Uninstall","Resinstall","None")
          } ELSEIF ($OutputObj.CurrentVersion -ge $OutputObj.LastestVersion) {
              Write-warning "Installed version of {f} greater than expected."
              $OutputObj | Add-Member -MemberType NoteProperty -Name InstallAction -Value "Error"
              $OutPutObj.InstallOptions = @("None")
          } ELSEIF ($OutputObj.CurrentVersion -eq $OutputObj.Product) {
              $OutputObj | Add-Member -MemberType NoteProperty -Name InstallAction -Value "None"
          }
      } ELSE {
          $OutputObj | Add-Member -MemberType NoteProperty -Name InstallAction -Value "Install"
          $OutPutObj.InstallOptions = @("Install")
      }
  
  # &lt;Example code that doesn't work&gt;
      $OutputObj.ComboBox = New-object System.Windows.Forms.ComboBox
      $OutputObj.ComboBox.Name = ""
      $OutputObj.ComboBox.Items.AddRange($OutPutObj.InstallAction)
      $OutputObj.ComboBox.DataBindings.DefaultDataSourceUpdateMode = 0
      $OutputObj.ComboBox.Location = New-Object System.Drawing.Point(200,200)
      $OutputObj.ComboBox.Controls.Add($ComboBox)
  # &lt;/Example code that doesn't work&gt;
      ## Add to list or update ##
      [Array]$Cots.Software += $OutputObj
  
  }
  $COTS.Load = Import-csv "$PSScriptRoot\3rdPartyCots.csv"
  $COTS.AllInstalled = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ | Get-ItemProperty
  $COTS.AllInstalled += Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\ | Get-ItemProperty
  IF (Test-path HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\) { $COTS.AllInstalled += Get-ChildItem HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ | Get-ItemProperty}
  $COTS.Programs = ($Cots.AllInstalled | Where {$_.DisplayName -ne $Null -AND $_.SystemComponent -ne "1" -AND $_.ParentKeyName -eq $Null} |Select *).GetEnumerator() | Sort-Object {"$_"}
  ForEach ($Cot in $Cots.load) {CheckProgram $Cot}
  
  
  
  
  function MainMenuForm {
  
  #region Import the Assemblies
  [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
  [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
  
  # Create Forms and Items {
  $MainMenu = New-Object System.Windows.Forms.Form
  $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
  
  #Buttons
  $HomeButton = New-Object System.Windows.Forms.Button
  $ScriptSettingsButton = New-Object System.Windows.Forms.Button
  $COTSButton = New-Object System.Windows.Forms.Button
  $MicrosoftButton = New-Object System.Windows.Forms.Button
  $ConfigureButton = New-Object System.Windows.Forms.Button
  $MiscToolsButton = New-Object System.Windows.Forms.Button
  
  #Misc Items
  $ProgressBar = New-Object System.Windows.Forms.ProgressBar
  $StatusBar = New-Object System.Windows.Forms.StatusBar
  
  #Tab Control
  $TabControl = New-object System.Windows.Forms.TabControl
  
  #Tabs
  $HomeTab = New-Object System.Windows.Forms.TabPage
  $ScriptSettingsTab = New-Object System.Windows.Forms.TabPage
  $COTSTab = New-Object System.Windows.Forms.TabPage
  $MicrosoftTab = New-Object System.Windows.Forms.TabPage
  $ConfigureTab = New-Object System.Windows.Forms.TabPage
  $MiscToolsTab = New-Object System.Windows.Forms.TabPage
  
  $MicrosoftDataGrid = New-Object System.Windows.Forms.DataGridView
  #----------------------------------------------
  #Generated Event Script Blocks
  #----------------------------------------------
  #Unknown
  $OnLoad_StateCorrection = { $MainMenu.WindowState = $InitialFormWindowState }
  $OnLoad_MicrosoftDataGrid = { LoadMicrosoft }
  
  #Buttons
  $HomeButton_OnClick = { $TabControl.SelectTab($HomeTab) }
  $ScriptSettingsButton_OnClick = { $TabControl.SelectTab($ScriptSettingsTab) }
  $COTSButton_OnClick = {$TabControl.SelectTab($COTSTab)}
  $MicrosoftButton_OnClick = {$TabControl.SelectTab($MicrosoftTab)}
  $ConfigureButton_OnClick = {$TabControl.SelectTab($ConfigureTab)}
  $MiscToolsButton_OnClick = {$TabControl.SelectTab($MiscToolsTab)}
  
  #Load Main Menu
  $MainMenu.ClientSize = New-Object System.Drawing.Size(665,474)
  $MainMenu.DataBindings.DefaultDataSourceUpdateMode = 0
  $MainMenu.Name = "MainMenu"
  $MainMenu.Text = "Patching Script"
  $MainMenu.TopMost = $True
  
  # == Home Button == #
  $HomeButton.Name = "HomeButton"
  $HomeButton.Text = "Home"
  $HomeButton.TabIndex = 2
  $HomeButton.UseVisualStyleBackColor = $True
  $HomeButton.add_Click($HomeButton_OnClick)
  $HomeButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $HomeButton.Location = New-Object System.Drawing.Point(12,69)
  $HomeButton.Size = New-Object System.Drawing.Size(100,35)
  
  $MainMenu.Controls.Add($HomeButton)
  
  # == Script Settings Button == #
  $ScriptSettingsButton.Name = "ScriptSettingsButton"
  $ScriptSettingsButton.Text = "Script Settings"
  $ScriptSettingsButton.TabIndex = 3
  $ScriptSettingsButton.UseVisualStyleBackColor = $True
  $ScriptSettingsButton.add_Click($ScriptSettingsButton_OnClick)
  $ScriptSettingsButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $ScriptSettingsButton.Size = New-Object System.Drawing.Size(100,35)
  $ScriptSettingsButton.Location = New-Object System.Drawing.Point(12,110)
  
  $MainMenu.Controls.Add($ScriptSettingsButton)
  
  # == COTS Button == #
  $COTSButton.Name = "COTSButton"
  $COTSButton.Text = "C.O.T.S."
  $COTSButton.TabIndex = 4
  $COTSButton.UseVisualStyleBackColor = $True
  $COTSButton.add_Click($COTSButton_OnClick)
  $COTSButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $COTSButton.Size = New-Object System.Drawing.Size(100,35)
  $COTSButton.Location = New-Object System.Drawing.Point(12,151)
  
  $MainMenu.Controls.Add($COTSButton)
  
  # == Microsoft Button == #
  $MicrosoftButton.Name = "MicrosoftButton"
  $MicrosoftButton.Text = "Microsoft Patches"
  $MicrosoftButton.TabIndex = 5
  $MicrosoftButton.UseVisualStyleBackColor = $True
  $MicrosoftButton.add_Click($MicrosoftButton_OnClick)
  $MicrosoftButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $MicrosoftButton.Size = New-Object System.Drawing.Size(100,35)
  $MicrosoftButton.Location = New-Object System.Drawing.Point(12,192)
  
  $MainMenu.Controls.Add($MicrosoftButton)
  
  # == Configure Button == #
  $ConfigureButton.Name = "ConfigureButton"
  $ConfigureButton.Text = "Configure Script"
  $ConfigureButton.TabIndex = 6
  $ConfigureButton.UseVisualStyleBackColor = $True
  $ConfigureButton.add_Click($ConfigureButton_OnClick)
  $ConfigureButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $ConfigureButton.Location = New-Object System.Drawing.Point(12,233)
  $ConfigureButton.Size = New-Object System.Drawing.Size(100,35)
  
  $MainMenu.Controls.Add($ConfigureButton)
  
  # == Misc Tools Button == #
  $MiscToolsButton.Name = "MiscToolsButton"
  $MiscToolsButton.Text = "Misc Tools"
  $MiscToolsButton.TabIndex = 7
  $MiscToolsButton.UseVisualStyleBackColor = $True
  $MiscToolsButton.add_Click($MiscToolsButton_OnClick)
  $MiscToolsButton.DataBindings.DefaultDataSourceUpdateMode = 0
  $MiscToolsButton.Location = New-Object System.Drawing.Point(12,274)
  $MiscToolsButton.Size = New-Object System.Drawing.Size(100,35)
  
  $MainMenu.Controls.Add($MiscToolsButton)
  
  # == Tab Control == #
  $TabControl.Name = "TabControl"
  $TabControl.TabIndex = 4
  $TabControl.SelectedIndex = 0
  $TabControl.DataBindings.DefaultDataSourceUpdateMode = 0
  $TabControl.Location = New-Object System.Drawing.Point(124,65)
  $TabControl.Size = New-Object System.Drawing.Size(525,375)
  $TabControl.visible = $True
  $MainMenu.Controls.Add($TabControl)
  
  $TabControl.SizeMode = "Fixed"
  $TabControl.ItemSize = New-Object System.Drawing.Size(0, 1)
  $TabControl.Appearance = "Buttons"
  
  ## Possibly Unneeded Info
  #$ScriptSettingsTab.Location = New-Object System.Drawing.Point(4,22)
  #$ScriptSettingsTab.Size = New-Object System.Drawing.Size(535,374)
  
  # == Home Tab == #
  $HomeTab.Name = "HomeTab"
  $HomeTab.Text = "Home"
  $HomeTab.TabIndex = 1
  $HomeTab.UseVisualStyleBackColor = $True
  $HomeTab.DataBindings.DefaultDataSourceUpdateMode = 0
  
  $TabControl.Controls.Add($HomeTab)
  
  # == Script Settings Tab == #
  $ScriptSettingsTab.Name = "ScriptSettingsTab"
  $ScriptSettingsTab.Text = "Home"
  $ScriptSettingsTab.TabIndex = 2
  $ScriptSettingsTab.UseVisualStyleBackColor = $True
  $ScriptSettingsTab.DataBindings.DefaultDataSourceUpdateMode = 0
  $ScriptSettingsTab.BackColor = [System.Drawing.Color]::CornflowerBlue
  
  $TabControl.Controls.Add($ScriptSettingsTab)
  
  # == C.O.T.S. Tab == #
  $COTSTab.Name = "COTSTab"
  $COTSTab.Text = "Home"
  $COTSTab.TabIndex = 2
  $COTSTab.UseVisualStyleBackColor = $True
  $COTSTab.DataBindings.DefaultDataSourceUpdateMode = 0
  $COTSTab.BackColor = [System.Drawing.Color]::Blue
  
  $TabControl.Controls.Add($COTSTab)
  
  # == Microsoft Patches Tab == #
  $MicrosoftTab.Name = "MicrosoftTab"
  $MicrosoftTab.Text = "Home"
  $MicrosoftTab.TabIndex = 2
  $MicrosoftTab.UseVisualStyleBackColor = $True
  $MicrosoftTab.DataBindings.DefaultDataSourceUpdateMode = 0
  $MicrosoftTab.BackColor = [System.Drawing.Color]::Green
  
  $TabControl.Controls.Add($MicrosoftTab)
  # == Microsoft Data Grid == #
  $MicrosoftDataGrid.Name
  $MicrosoftDataGrid.Size = New-Object System.Drawing.Size(492,308)
  $MicrosoftDataGrid.DataBindings.DefaultDataSourceUpdateMode = 0 
  $MicrosoftDataGrid.HeaderForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0) 
  $MicrosoftDataGrid.Name = "MicrosoftDataGrid" 
  $MicrosoftDataGrid.DataMember = "" 
  $MicrosoftDataGrid.TabIndex = 0 
  $MicrosoftDataGrid.Location = New-Object System.Drawing.Point(13,48)
  
  $MicrosoftDataGrid.autosize = $true
  $MicrosoftTab.Controls.Add($MicrosoftDataGrid)
  
  # == Configure Script Tab == #
  $ConfigureTab.Name = "ConfigureTab"
  $ConfigureTab.Text = "Home"
  $ConfigureTab.TabIndex = 2
  $ConfigureTab.UseVisualStyleBackColor = $True
  $ConfigureTab.DataBindings.DefaultDataSourceUpdateMode = 0
  $ConfigureTab.BackColor = [System.Drawing.Color]::Red
  
  $TabControl.Controls.Add($ConfigureTab)
  
  # == Misc Tools Tab == #
  $MiscToolsTab.Name = "ConfigureTab"
  $MiscToolsTab.Text = "Home"
  $MiscToolsTab.TabIndex = 2
  $MiscToolsTab.UseVisualStyleBackColor = $True
  $MiscToolsTab.DataBindings.DefaultDataSourceUpdateMode = 0
  $MiscToolsTab.BackColor = [System.Drawing.Color]::blue
  
  $TabControl.Controls.Add($MiscToolsTab)
  
  # == Progress Bar == #
  $progressBar.Name = "progressBar"
  $progressBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $progressBar.Location = New-Object System.Drawing.Point(589,458)
  $progressBar.Size = New-Object System.Drawing.Size(75,15)
  $progressBar.TabIndex = 0
  
  $MainMenu.Controls.Add($progressBar)
  
  # == Status bar == #
  $StatusBar.Name = "StatusBar"
  $StatusBar.Text = "statusBar1"
  $StatusBar.TabIndex = 1
  $StatusBar.Size = New-Object System.Drawing.Size(665,18)
  $StatusBar.Location = New-Object System.Drawing.Point(0,456)
  $StatusBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $StatusBar.add_PanelClick($statusBar_PanelClick)
  
  $MainMenu.Controls.Add($StatusBar)
  
  # == Save and Open Form == #
  $InitialFormWindowState = $MainMenu.WindowState
  
  $MainMenu.add_Load($OnLoad_StateCorrection)
  $MainMenu.add_Load($OnLoad_MicrosoftDataGrid)
  
  $MainMenu.ShowDialog()| Out-Null
  
  } #End Function
  
  MainMenuForm
  </code></pre>