Piping a user's selection from a list is failing

This topic contains 2 replies, has 2 voices, and was last updated by Profile photo of Dave Wyatt Dave Wyatt 3 years, 9 months ago.

  • Author
    Posts
  • #10406
    Profile photo of notarat
    notarat
    Participant

    I am trying to understand the code used to create a form from which the user can select an item. For instance...the form lists computernames and when the user selects a computername from the list, that computername is piped to a powershell script.

    I found an excellent example of how to create the form on the Tech Net site(see code below) but I am unsure how to pipe the selected item to a script.

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    
    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Select a Computer"
    $objForm.Size = New-Object System.Drawing.Size(300,200) 
    $objForm.StartPosition = "CenterScreen"
    
    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
        {$x=$objListBox.SelectedItem;$objForm.Close()}})
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
        {$objForm.Close()}})
    
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$x=$objListBox.SelectedItem;$objForm.Close()})
    $objForm.Controls.Add($OKButton)
    
    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(150,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click({$objForm.Close()})
    $objForm.Controls.Add($CancelButton)
    
    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(10,20) 
    $objLabel.Size = New-Object System.Drawing.Size(280,20) 
    $objLabel.Text = "Please select a computer:"
    $objForm.Controls.Add($objLabel) 
    
    $objListBox = New-Object System.Windows.Forms.ListBox 
    $objListBox.Location = New-Object System.Drawing.Size(10,40) 
    $objListBox.Size = New-Object System.Drawing.Size(260,20) 
    $objListBox.Height = 80
    
    [void] $objListBox.Items.Add("atl-dc-001")
    [void] $objListBox.Items.Add("atl-dc-002")
    [void] $objListBox.Items.Add("atl-dc-003")
    [void] $objListBox.Items.Add("atl-dc-004")
    [void] $objListBox.Items.Add("atl-dc-005")
    [void] $objListBox.Items.Add("atl-dc-006")
    [void] $objListBox.Items.Add("atl-dc-007")
    
    $objForm.Controls.Add($objListBox) 
    
    $objForm.Topmost = $True
    
    $objForm.Add_Shown({$objForm.Activate()})
    [void] $objForm.ShowDialog()
    
    $x
    

    Running the script and then selecting any of the available computers does not result in $x storing any value...

    I thought this line:

    $OKButton.Add_Click({$x=$objListBox.SelectedItem;$objForm.Close()})

    was used to store the computer I selected when I click the computername then click OK, but $x does not contain any value.

    How can I actually record my selection from the list and pass that to the rest of my script?

    P.S. A "Preview Post" function would be awesome...just sayin' 🙂

  • #10408
    Profile photo of notarat
    notarat
    Participant

    nm...

    answered it myself...

    $objListBox.SelectedItem

    contains the value that is recorded so

    $x=($objListBox.SelectedItem),/pre> puts the value in X
  • #10409
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    It's probably cleaner to check $objListBox.SelectedItem after the call to $objForm.ShowDialog() , but if you really wanted to do that from inside the KeyDown / Click handlers, you'd have to scope the variable, like this: (code reformatted for clarity, but all I added was "script:"

    $objForm.Add_KeyDown({
        if ($_.KeyCode -eq "Enter") 
        {
            $script:x = $objListBox.SelectedItem
            $objForm.Close()
        }
    })
    

You must be logged in to reply to this topic.