Winforms Powershell-如何将变量从listbox项更改为combobox项?

Winforms Powershell-如何将变量从listbox项更改为combobox项?,winforms,powershell,variables,combobox,listbox,Winforms,Powershell,Variables,Combobox,Listbox,我试图通过删除用户可以选择到Powershell中受约束的组合框(使用DropDownList锁定用户输入)中的项目列表框来清理GUI。到目前为止,我还无法获得反映所选combobox项的变量 理想情况下,我希望$Env等于在组合框中选择的文本字符串,而不是$listbox 我试图跟随,但没有任何效果,因为我不明白如何使用“SelectedIndexChanged”事件…我可能只是不完全理解如何使用它的语法…一个代码示例将非常棒 我目前的代码是: 添加类型-AssemblyName System

我试图通过删除用户可以选择到Powershell中受约束的组合框(使用DropDownList锁定用户输入)中的项目列表框来清理GUI。到目前为止,我还无法获得反映所选combobox项的变量

理想情况下,我希望$Env等于在组合框中选择的文本字符串,而不是$listbox

我试图跟随,但没有任何效果,因为我不明白如何使用“SelectedIndexChanged”事件…我可能只是不完全理解如何使用它的语法…一个代码示例将非常棒

我目前的代码是:

添加类型-AssemblyName System.Windows.Forms
添加类型-AssemblyName System.Drawing
$form=新对象System.Windows.Forms.form
$form.Text=“选择一个环境”
$form.Size=新对象系统.Drawing.Size(190250)
$form.StartPosition=“中心屏幕”
$OKButton=新建对象System.Windows.Forms.Button
$OKBUTON.Location=新对象系统.绘图.点(10180)
$OKBUTON.Size=新对象系统.Drawing.Size(75,23)
$OKButton.Text=“确定”
$OKButton.DialogResult=[System.Windows.Forms.DialogResult]::确定
$form.AcceptButton=$OKButton
$form.Controls.Add($OK按钮)
$label=新对象System.Windows.Forms.label
$label.Location=新对象系统.绘图.点(10,20)
$label.Size=新对象系统.Drawing.Size(280,20)
$label.Text=“请选择一个环境:”
$form.Controls.Add($label)
$listBox=新对象System.Windows.Forms.listBox
$listBox.Location=新对象系统.绘图.点(10,40)
$listBox.Size=新对象系统.Drawing.Size(150,20)
$listBox.Height=140
[void]$listBox.Items.AddRange(@(“PROD”、“QA1”、“QA2”、“TR”))
$form.Controls.Add($listBox)
$form.Topmost=$True
做
{
$result=$form.ShowDialog()
if($ListBox.SelectedIndices.Count-lt 1-和$result-eq[System.Windows.Forms.DialogResult]::确定)
{
写入警告“未选择任何内容,请选择服务器。”
}
}
直到($result-eq[System.Windows.Forms.DialogResult]::确定-和$listBox.selecteddinces.Count-ge 1)-或$result-ne[System.Windows.Forms.DialogResult]::确定)
if($result-eq[System.Windows.Forms.DialogResult]::确定)
{
$Env-eq$listBox.SelectedItem
}

这是一个用于在powershell中使用事件的快速GUID:
在WinForms对象上使用
|获取成员-成员类型事件
获取可用事件列表>
$OKButton |获取成员-成员类型事件

添加一个脚本块,一旦事件触发,该脚本块将被执行。><代码>$OK按钮。添加\单击({$scriptgoesher})。注意scriptblock的作用域(
PS>关于作用域的帮助

我用事件而不是循环重新编写了脚本,并在重要部分添加了注释。如果你有多件事要做,事情会容易处理得多。但是范围是一个缺点

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"
添加类型-AssemblyName System.Windows.Forms
添加类型-AssemblyName System.Drawing
$form=新对象System.Windows.Forms.form
$form.Text=“选择一个环境”
$form.Size=新对象系统.绘图.尺寸(380250)
$form.StartPosition=“中心屏幕”
$form.Topmost=$True
$OKButton=新建对象System.Windows.Forms.Button
$OKBUTON.Location=新对象系统.绘图.点(10180)
$OKBUTON.Size=新对象系统.Drawing.Size(75,23)
$OKButton.Text=“确定”
#$OKButton.DialogResult=[System.Windows.Forms.DialogResult]::确定#移动到事件
$form.AcceptButton=$OKButton
$form.Controls.Add($OK按钮)
$label=新对象System.Windows.Forms.label
$label.Location=新对象系统.绘图.点(10,20)
$label.Size=新对象系统.Drawing.Size(280,20)
$label.Text=“请选择一个环境:”
$form.Controls.Add($label)
$listBox=新对象System.Windows.Forms.listBox
$listBox.Location=新对象系统.绘图.点(10,40)
$listBox.Size=新对象系统.Drawing.Size(150140)#第二个数字是高度
#$listBox.Height=140
[void]$listBox.Items.AddRange(@(“PROD”、“QA1”、“QA2”、“TR”))
$form.Controls.Add($listBox)
$comboBox=新对象System.Windows.Forms.comboBox
$comboBox.Location=新对象系统.绘图.点(190,40)
$comboBox.Size=新对象系统.Drawing.Size(150,20)
[void]$comboBox.Items.AddRange(@(“产品”、“QA1”、“QA2”、“TR”))
$form.Controls.Add($comboBox)
#地区活动
#注册一些触发操作的事件
$listBox.add_SelectedIndexChanged({
#事件实际上是$listBox.SelectedIndexChanged,但我们要添加操作。get member中未列出ADD\u SelectedIndexChanged。
$ListSelected=$listBox.SelectedItem
写入主机“ListSelected=$ListSelected”
#您会注意到$ListSelected在事件之外还不可用。它在scriptblock的范围内。
})
$comboBox.add\u SelectedIndexChanged({
#为了防止作用域出现问题,请在更高的作用域中定义变量
$script:SelectedItem=$comboBox.SelectedItem
$global:SelectedIndex=$comboBox.SelectedItem
写入主机“SelectedItem=$SelectedItem”
})
$script:OKScript={
#或者在更高的范围内定义整个脚本块。。。
如果($comboBox.SelectedIndex-ge 0){
$Env=$comboBox.SelectedItem#小心点$Env是环境变量的开头,如$Env:path
$form.DialogResult=[System.Windows.Forms.DialogResult]::确定
$form.close()
}否则{
写入警告“未选择任何内容,请选择服务器。”
}
}
#…并在同一范围内执行它:
$OKButton.add_单击({.$OKScript})
#端区
$result=$form.ShowDialog()
写入主机“`r`n窗体已关闭`r`n结果如下:
“ListSelected=$ListSelected”
“结果=$result”
“环境=$env”
“SelectedIndex=$SelectedIndex”
“SelectedItem=$SelectedItem”

这是一个用于在powershell中使用事件的快速GUID:
在WinForms对象上使用
| Get Member-MemberType Event
获取