Powershell - как изменить переменную из элемента списка в элемент комбинированного списка? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь очистить свой графический интерфейс, удаляя списки элементов, которые пользователи могут выбрать, в ограниченный комбинированный список (используя DropDownList для блокировки ввода пользователя) в Powershell.До сих пор мне не удавалось получить переменную, отражающую выбранный элемент комбинированного списка.

В идеале я хочу получить значение $ Env, равное текстовой строке, выбранной в комбинированном окне, заменив $ listbox * 1003.*

Я пытался следовать элементам комбинированного списка powershell до переменной , но безрезультатно, поскольку я не понимаю, как использовать событие SelectedIndexChanged ... Возможно, я просто не совсем понимаю синтаксис того, какчтобы использовать это ... пример кода был бы потрясающим.

Текущий код, который у меня есть:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form 
$form.Text = "Select an environment"
$form.Size = New-Object System.Drawing.Size(190,250) 
$form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(10,180)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Please select an environment:"
$form.Controls.Add($label) 
$listBox = New-Object System.Windows.Forms.ListBox 
$listBox.Location = New-Object System.Drawing.Point(10,40) 
$listBox.Size = New-Object System.Drawing.Size(150,20) 
$listBox.Height = 140

[void] $listBox.Items.AddRange(@("PROD", "QA1", "QA2", "TR"))
$form.Controls.Add($listBox) 
$form.Topmost = $True
do
{
    $result = $form.ShowDialog()
    if ($ListBox.SelectedIndices.Count -lt 1 -and $result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        Write-Warning 'Nothing was selected, please select a server.'
    }
}
until (($result -eq [System.Windows.Forms.DialogResult]::OK -and $listBox.SelectedIndices.Count -ge 1) -or $result -ne [System.Windows.Forms.DialogResult]::OK)
    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        $Env -eq $listBox.SelectedItem
    }

1 Ответ

0 голосов
/ 12 июля 2019

Вот краткое руководство по использованию событий в powershell:
Используйте | Get-Member -MemberType Event на вашем WinForms-объекте, чтобы получить список доступных событий> $OKButton | Get-Member -MemberType Event.
Добавьте скрипт-блок, который должен быть выполнен, как толькотриггеры событий.> $OKButton.add_Click({$ScriptGoesHere}).Следите за рамками блока скриптов (PS> help about_scopes)
Я переработал ваш скрипт с событиями вместо цикла и добавил комментарии к важным частям.С событиями намного проще справиться, если у вас есть несколько вещей.Но области видимости являются своего рода недостатком.

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form 
$form.Text = "Select an environment"
$form.Size = New-Object System.Drawing.Size(380,250) 
$form.StartPosition = "CenterScreen"
$form.Topmost = $True

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(10,180)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
#$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK    #Moved to the event
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Please select an environment:"
$form.Controls.Add($label) 

$listBox = New-Object System.Windows.Forms.ListBox 
$listBox.Location = New-Object System.Drawing.Point(10,40) 
$listBox.Size = New-Object System.Drawing.Size(150,140) # the second number is the height
#$listBox.Height = 140
[void] $listBox.Items.AddRange(@("PROD", "QA1", "QA2", "TR"))
$form.Controls.Add($listBox) 


$comboBox = New-Object System.Windows.Forms.ComboBox 
$comboBox.Location = New-Object System.Drawing.Point(190,40) 
$comboBox.Size = New-Object System.Drawing.Size(150,20) 
[void] $comboBox.Items.AddRange(@("PROD", "QA1", "QA2", "TR"))
$form.Controls.Add($comboBox)

#region Events
#register some events that trigger actions


$listBox.add_SelectedIndexChanged({    
    #The event is actually $listBox.SelectedIndexChanged but we want to ADD an action. add_SelectedIndexChanged is not listed in get-member.
    $ListSelected = $listBox.SelectedItem
    Write-Host "ListSelected = $ListSelected"
    # You will note that $ListSelected is not available outside the event yet. It is in the scope of the scriptblock.
})


$comboBox.add_SelectedIndexChanged({
    #To prevent trouble with the scope, define the variables in a higher scope
    $script:SelectedItem = $comboBox.SelectedItem
    $global:SelectedIndex = $comboBox.SelectedItem
    write-host "SelectedItem = $SelectedItem"
})

$script:OKScript = {
    # or define the whole ScriptBlock in a higher scope...
    if( $comboBox.SelectedIndex -ge 0){

        $Env = $comboBox.SelectedItem    #Be carefull $env is the beginning of environmental variables like $env:path
        $form.DialogResult = [System.Windows.Forms.DialogResult]::OK
        $form.close()

    }else{
        Write-Warning 'Nothing was selected, please select a server.'
    }
}

# ...and DotSource it to execute it in the same scope:
$OKButton.add_Click({. $OKScript})


#endregion

$result = $form.ShowDialog()


<# This would work but we use events
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $SelectedItem = $comboBox.SelectedItem
    $SelectedIndex = $comboBox.SelectedItem
}
#>


write-host "`r`nform is closed`r`nhere are the results:"

"ListSelected = $ListSelected"
"result = $result"

"env = $env"
"SelectedIndex = $SelectedIndex"
"SelectedItem = $SelectedItem"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...