Search code examples
powershellvariablescomboboxscripting

How do I indicate that a combo box has been populated with a selection?


I am attempting to create a form in Powershell. It contains a ComboBox dropdown option that I am using as a required field. Until an option is selected, the continue button will be disabled. This is the code for the ComboBox and the button enabling:

$TSTypeBox.Name = "TSType"
$TSTypeBox.Location = New-Object System.Drawing.Point(116,100)
$TSTypeBox.Size = New-Object System.Drawing.Size(145,20)
$TSTypeBox.add_MouseHover($ShowHelp)
$TSTypeBox.DropDownStyle = "DropDownList"
Foreach ($item in ("1","2","3","4","5")) {
    $TSTypeBox.Items.Add($item) | Out-Null
    }
$TSTypeBox.SelectedItem = $TSLocation
$handler_TSTypeBox_SelectedIndexChanged= {
        If (($TSTypeBox.Text) -and ($ComputerNameBox.Text)) 
        {
            $OKButton.Enabled = 1
        }
        Else 
        {
            $OKButton.Enabled = 0
        }
    }
$TSTypeBox.add_SelectedIndexChanged($handler_TSTypeBox_SelectedIndexChanged)

This code in particular works as intended so I'm not worried about that. I am here about the $TSTypeBox.SelectedItem = $TSLocation line that I included. I have code elsewhere that pulls the IP address of the computer the program is being run on, which is then matched against an if/elseif/else statement to determine if the computer belongs to 1 or to 2, which are options that you can see were added to the ComboBox in the code above.

That if/else statement updated the $TSLocation variable which I then use to force the selection of one of the dropdown options in the ComboBox. This works as well, but unfortunately it does not enable the continue button as I would like. I had a hard time looking up issues about this because its super particular and I am probably doing this incorrectly (I have very little experience with Powershell scripting). If you have any additional questions about this please let me know. Thanks!


Solution

  • Ok, this might illustrate your problem.

    Just because you set the SelectedItem value to something, doesn't mean the SelectedIndex changes

    #
    Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
    #
    $TSLocation = '2'
    #
    $form = New-Object System.Windows.Forms.Form
    $form.Text = "Test"
    $form.MinimumSize = '430,495'
    $form.MaximumSize = '430,545'
    $form.StartPosition = 'CenterScreen'
    #
    # Add form objects
    #
    $TSTypeBox = New-Object System.Windows.Forms.ComboBox
    $TSTypeBox.Name = "TSType"
    $TSTypeBox.Location = '116,100'
    $TSTypeBox.Size = '145,20'
    $TSTypeBox.add_MouseHover($ShowHelp)
    $TSTypeBox.DropDownStyle = "DropDownList"
    Foreach ($item in ("1","2","3","4","5")) {
        $TSTypeBox.Items.Add($item) | Out-Null
        }
    
    $ComputerNameBox = New-Object System.Windows.Forms.TextBox
    $ComputerNameBox.Location = '120,20'
    $ComputerNameBox.Size = '120,17'
    $ComputerNameBox.Text = 'test'
    
    $OutputBox = New-Object System.Windows.Forms.TextBox
    $OutputBox.Location = '120,240'
    $OutputBox.Size = '120,17'
    
    $OkButton = New-Object System.Windows.Forms.Button
    $OkButton.Location = '120,200'
    $OkButton.Size = '54,24'
    $OkButton.Text = 'OK'
    
    $form.controls.AddRange(@($TSTypeBox,$OkButton,$ComputerNameBox,$OutputBox))
    #
    # Main Script goes here
    #
    $handler_TSTypeBox_SelectedIndexChanged= {
        $OutputBox.Text = "SelectedIndex is " + $TSTypeBox.SelectedIndex
            If (($TSTypeBox.Text) -and ($ComputerNameBox.Text)) 
            {
                $OKButton.Enabled = 1
            }
            Else 
            {
                $OKButton.Enabled = 0
            }
        }
    $TSTypeBox.add_SelectedIndexChanged($handler_TSTypeBox_SelectedIndexChanged)
    
    #
    $TSTypeBox.SelectedIndex = $TSTypeBox.FindStringExact($TSLocation)
    #
    # Show form
    $form.ShowDialog() | Out-Null
    $form.Dispose()
    # End
    

    If in doubt, always best to simplify your script and add debug ,logging or output that shows what values are changing

    Now that the problem is clear - this article points you in the right direction:

    How do I set the selected item in a comboBox to match my string using C#?