根据 ComboBox 选择填充 ComboBox 2

Populate ComboBox2 depending on ComboBox1 selection

几天的搜索和尝试多个选项,但实际上没有任何效果。贴上之前的代码。

我已经从 XAML 导入了所有对象(全部设置在变量中),我不知道这是否会成为问题。我不认为,因为其他一切似乎都正常工作。

我只想让我的 Tab2CBB2 根据 Tab1CBB1 的选择显示值。任何人都可以帮忙吗? (我没有粘贴整个代码,也没有粘贴路径,但你可以帮助我)。请注意,这是我多次尝试中的两次。谢谢

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')

[xml]$xaml = @" ...

"@

#Read XAML (Parse it)
$reader=(New-Object System.Xml.XmlNodeReader $XAML)
$Window=[Windows.Markup.XamlReader]::Load( $reader )

$listQA14 = Get-ChildItem $pathQA14 -name
$listQA15 = Get-ChildItem $pathQA15 -name
$listDBQA = Get-ChildItem $pathDBQA -name

$Tab1CBB1_SelectedIndexChanged= {
    $Tab1CBB2.Items.Clear() # Clear the list
    $Tab1CBB2.Text = $null  # Clear the current entry
    Switch ($Tab1CBB1.Text) {
        'QA14' {        
            $ListQA14 | ForEach { $Tab1CBB2.Items.Add($_) }
        }


        'QA15' {        
            $ListQA15 | ForEach { $Tab1CBB2.Items.Add($_) }
        }

        'ARIELDBQA' {        
            $ListDBQA | ForEach { $Tab1CBB2.Items.Add($_) }
        }
        }
        }

$Tab1CBB1.add_SelectedIndexChanged($Tab1CBB1_SelectedIndexChanged)


#Displays the Window
$Window.ShowDialog() | out-null

这是另一个尝试过的选项:

#ComboBox1------
$ItemsCBB1 = @('ARIELDBQA','QA14','QA15')
foreach ($Item in $ItemsCBB1) {
$Tab1CBB1.Items.Add($Item)
}


#ComboBox2-------

    if ($Tab1CBB1.SelectedItem -eq 'QA14') {
        $Tab1CBB2.Items.Clear()
        foreach ($Serie in $listQA14) {
        $Tab1CBB2.Items.Add($Serie)
        }
    }
     

    elseif ($Tab1CBB1.SelectedItem -eq 'QA15') {
        $Tab1CBB2.Items.Clear()
        foreach ($Serie in $listQA15) {
        $Tab1CBB2.Items.Add($Serie)
           }
    }

    elseif ($Tab1CBB1.SelectedItem -eq 'listDBQA') {
           $Tab1CBB2.Items.Clear()
           foreach ($Serie in $listDBQA) {
           $Tab1CBB2.Items.Add($Serie)
           }
    }

也试过这个:$Selection = $Tab1CBB1.SelectedItem.ToString() 变量 $selection 放在 'if' 之后,但不起作用 请注意,当我指出当前选择是什么时,它工作正常。问题似乎来自 'recording' 单击时的选择... Thnaks !

您似乎想要的一个简单示例是这样的。

### Powershell populate ComboBox 2 based on ComboBox 1 Selection
Add-type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$form1 = New-Object 'System.Windows.Forms.Form'

$labelDoubleClickOnAnyItem = New-Object 'System.Windows.Forms.Label'

$listbox2 = New-Object 'System.Windows.Forms.ListBox'
$listbox1 = New-Object 'System.Windows.Forms.ListBox'

$buttonOK = New-Object 'System.Windows.Forms.Button'

$form1_Load={
    $items=1..9 | 
    ForEach-Object {"List item $_"}
    
    $listbox1.Items.AddRange($items)
}

$listbox1_MouseDoubleClick=[System.Windows.Forms.MouseEventHandler]{
    $listbox2.Items.Add($listbox1.SelectedItem)
    $listbox1.Items.Remove($listbox1.SelectedItem)
}

$listbox2_MouseDoubleClick=[System.Windows.Forms.MouseEventHandler]{
    $listbox1.Items.Add($listbox2.SelectedItem)
    $listbox2.Items.Remove($listbox2.SelectedItem)
}

$form1.Controls.Add($labelDoubleClickOnAnyItem)
$form1.Controls.Add($listbox2)
$form1.Controls.Add($listbox1)
$form1.Controls.Add($buttonOK)
$form1.AcceptButton = $buttonOK
$form1.ClientSize = '378, 388'
$form1.FormBorderStyle = 'FixedDialog'
$form1.MaximizeBox = $False
$form1.MinimizeBox = $False
$form1.Name = 'form1'
$form1.StartPosition = 'CenterScreen'
$form1.Text = 'Form'
$form1.add_Load($form1_Load)

$labelDoubleClickOnAnyItem.Font = 'Microsoft Sans Serif, 9.75pt, style=Bold, Italic'
$labelDoubleClickOnAnyItem.Location = '13, 13'
$labelDoubleClickOnAnyItem.Name = 'labelDoubleClickOnAnyItem'
$labelDoubleClickOnAnyItem.Size = '353, 41'
$labelDoubleClickOnAnyItem.TabIndex = 3
$labelDoubleClickOnAnyItem.Text = 'Double click on any item to move it from one box to the other.'

$listbox2.FormattingEnabled = $True
$listbox2.Location = '200, 67'
$listbox2.Name = 'listbox2'
$listbox2.Size = '166, 277'
$listbox2.Sorted = $True
$listbox2.TabIndex = 2
$listbox2.add_MouseDoubleClick($listbox2_MouseDoubleClick)

$listbox1.FormattingEnabled = $True
$listbox1.Location = '12, 67'
$listbox1.Name = 'listbox1'
$listbox1.Size = '167, 277'
$listbox1.Sorted = $True
$listbox1.TabIndex = 1
$listbox1.add_MouseDoubleClick($listbox1_MouseDoubleClick)

$buttonOK.Anchor = 'Bottom, Right'
$buttonOK.DialogResult = 'OK'
$buttonOK.Location = '291, 353'
$buttonOK.Name = 'buttonOK'
$buttonOK.Size = '75, 23'
$buttonOK.TabIndex = 0
$buttonOK.Text = '&OK'

$form1.ShowDialog()

甚至仅使用 ComboBox 元素也是如此

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = New-Object System.Drawing.Point(498,459)
$Form.text                       = 'Form'
$Form.TopMost                    = $false
$Form.StartPosition              = 'CenterScreen'

$ComboBox1                       = New-Object system.Windows.Forms.ComboBox
$ComboBox1.text                  = ''
$ComboBox1.width                 = 216
$ComboBox1.height                = 75
@('ComboxItem1','ComboxItem2','ComboxItem3') | 
ForEach-Object {[void] $ComboBox1.Items.Add($_)}
$ComboBox1.location              = New-Object System.Drawing.Point(31,41)
$ComboBox1.Font                  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)

$ComboBox2                       = New-Object system.Windows.Forms.ComboBox
$ComboBox2.text                  = ''
$ComboBox2.width                 = 213
$ComboBox2.height                = 38
$ComboBox2.location              = New-Object System.Drawing.Point(32,73)
$ComboBox2.Font                  = New-Object System.Drawing.Font('Microsoft Sans Serif',10)

Function Add-ItemToComboBox2
{
    $ComboBox2.Items.Add($ComboBox1.SelectedItem)
    $ComboBox2.Refresh()
}

$Form.controls.AddRange(
    @(
        $ComboBox1,
        $ComboBox2
    )
)

$ComboBox1.Add_SelectedIndexChanged({ Add-ItemToComboBox2 })

[void]$Form.ShowDialog()

您没有说明您使用什么 UX/UI 工具来设计和实现您的 图形用户界面。然而,硬编码也只是一个挑战。因此,请考虑使用其中之一来完成您的 UX/UI 工作。您的 UX/UI 应该可以正常工作,无论您背后是否有 PowerShell 代码(或任何其他语言)。无论可能实施的 UX/UI 是什么,您的 PowerShell 代码都应该可以正常工作。您的 UX/UI 代码应该与您的操作代码分开。您从 UX/UI.

调用您的操作代码

免费:

https://poshgui.com

https://www.youtube.com/results?search_query=poshgui

https://visualstudio.microsoft.com/vs/community

Be sure to thoroughly read the licensing agreement for VS.

https://www.youtube.com/results?search_query=vs+2019+community+winforms

购买

https://ironmansoftware.com/psscriptpad

https://www.youtube.com/results?search_query=psscriptpad

https://ironmansoftware.com/powershell-pro-tools

https://www.youtube.com/results?search_query=powershell-pro-tools

https://www.sapien.com/software/powershell_studio

https://www.youtube.com/results?search_query=Sapien%27s+powershell+studio++winforms

https://visualstudio.microsoft.com/vs

https://www.youtube.com/results?search_query=vs+2019+community+winforms

基本上,您所要做的就是在 $Tab1CBB1_SelectedIndexChanged 脚本块中使用带有 script scoping 的各种列表。

否则,脚本块内的变量是未知的。

$Tab1CBB1_SelectedIndexChanged = {
    $Tab1CBB2.Items.Clear() # Clear the list
    $Tab1CBB2.Text = $null  # Clear the current entry
    switch ($Tab1CBB1.Text) {
        'QA14'      { $script:ListQA14 | ForEach-Object { $Tab1CBB2.Items.Add($_) } }
        'QA15'      { $script:ListQA15 | ForEach-Object { $Tab1CBB2.Items.Add($_) } }
        'ARIELDBQA' { $script:ListDBQA | ForEach-Object { $Tab1CBB2.Items.Add($_) } }
    }
}

另一种方法可能是动态获取要在组合框中输入的项目,特别是因为这些是文件列表并且可以在使用您的表单时更改:

$Tab1CBB1_SelectedIndexChanged = {
    $Tab1CBB2.Items.Clear() # Clear the list
    $Tab1CBB2.Text = $null  # Clear the current entry
    switch ($Tab1CBB1.Text) {
        'QA14'      { $path = $script:pathQA14 ; break }
        'QA15'      { $path = $script:pathQA15 ; break }
        'ARIELDBQA' { $path = $script:pathDBQA }
    }
    Get-ChildItem -Path $path -Name | ForEach-Object { $Tab1CBB2.Items.Add($_) }
}