如何指示组合框已填充选择?

Posted

技术标签:

【中文标题】如何指示组合框已填充选择?【英文标题】:How do I indicate that a combo box has been populated with a selection? 【发布时间】:2022-01-14 13:59:00 【问题描述】:

我正在尝试在 Powershell 中创建一个表单。它包含一个 ComboBox 下拉选项,我将其用作必填字段。在选择一个选项之前,继续按钮将被禁用。这是 ComboBox 和按钮启用的代码:

$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)

这段代码特别能按预期工作,所以我不担心。我在这里是关于我包含的$TSTypeBox.SelectedItem = $TSLocation 行。我在其他地方有代码可以提取正在运行程序的计算机的 IP 地址,然后将其与 if/elseif/else 语句进行匹配,以确定计算机属于1 还是2,这是选项您可以看到已在上面的代码中添加到 ComboBox 中。

if/else 语句更新了$TSLocation 变量,然后我使用该变量来强制选择组合框中的下拉选项之一。这也有效,但不幸的是它没有像我想要的那样启用继续按钮。我很难查找有关此的问题,因为它非常特殊,而且我可能做错了(我对 Powershell 脚本编写的经验很少)。如果您对此有任何其他问题,请告诉我。谢谢!

【问题讨论】:

您是否尝试过将“启用”设置为布尔值? $OKButton.Enabled = $false 等? 您也许还可以在设置启用后运行:[System.Windows.Forms.Application]::DoEvents(),但我不确定是否有必要...... 更改 $TSLocation 时如何强制选择?如果您粘贴一个最小的工作示例脚本会更容易吗? @Sceptalist 对不起,我想我在帖子的前面没有说清楚。我使用第一段中的代码行“强制”选择,$TSTypeBox.SelectedItem = $TSLocation $TSLocation 变量仅在程序首次运行时更改一次。 我怀疑这与范围界定或您选择所选项目的方式有关,但如果没有脚本的工作示例,很难说。 【参考方案1】:

好的,这可能说明您的问题。

仅仅因为您将 SelectedItem 值设置为某个值,并不意味着 SelectedIndex 会发生变化

#
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

如果有疑问,最好始终简化您的脚本并添加调试、日志记录或输出以显示哪些值正在发生变化

现在问题已经很清楚了——这篇文章为你指明了正确的方向:

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

【讨论】:

在上面添加了一个指向以前的 SO 答案的链接,该答案应该可以解决您的问题。 这似乎仍然不起作用......我明白你在说什么,也是我的假设,但无论出于何种原因我都无法让它工作。复制您的代码,当字段为空时,该按钮不会被禁用,老实说,我不知道如何解决这个问题。我将尝试将此函数链接到一个复选框,它只是二进制而不是自动的。我正在寻找的特定功能可能不起作用。谢谢!! 查看我发布的链接上的答案 - 您需要设置 SelectedIndex 属性,而不是 SelectedItem 我已经修改了上面的脚本作为示例。请记住,索引从零开始。当您为所有可能性编码时,该按钮需要禁用,例如为 ComputerName 文本框编写事件处理程序。 是的,我在 ComputerName 框中也有一个处理程序。我确实更新了我的代码以使用 SelectedIndex 但它最终得到相同的结果,首次运行时按钮未启用。它必须与使其不兼容的 ComboBoxes 有关。我最终切换到复选框确认,这对我有用。感谢您的帮助 上面的脚本在运行时启用按钮。不确定您是否已在此处提供了所有信息。

以上是关于如何指示组合框已填充选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在访问中使用 VB 从选择查询中填充组合框?

Flash/Actionscript2 - 无法触发组合框“更改”事件

如何使用 VBA 根据值和组合框选择填充 excel 中的行?

尝试根据另一个组合框的选择填充两个组合框

组合框是自动填充选项,如何让它为空

根据组合框选择填充文本框