我有一个带有复选框的表单,它工作得很好,我可以根据需要显示我想要的所有项目,然后选择我想要的带有复选框的项目,然后当我按OK时,返回一个数组,我可以操作它。
我已经得到了CTRL+A的工作,以选择所有,和CTRL+D取消选择所有。
# Add the KeyDown event handler, used for CTRL+A (select all) / CTRL+D (deselect all)
$form.KeyPreview = $true
$form.Add_KeyDown({
param($checkboxSender, $checkboxEventArgs)
if (($checkboxEventArgs.KeyCode -eq "A") -and ($checkboxEventArgs.Control)) {
foreach ($control in $panel.Controls) {
$control.Checked = $true
}
}
if (($checkboxEventArgs.KeyCode -eq "D") -and ($checkboxEventArgs.Control)) {
foreach ($control in $panel.Controls) {
$control.Checked = $false
}
}
})
然后,在创建表单项的循环中,我放入:
if (($eventArgs.KeyCode -eq "A") -and ($eventArgs.Control)) {
foreach ($control in $panel.Controls) {
$control.Checked = $true
}
}
if (($eventArgs.KeyCode -eq "D") -and ($eventArgs.Control)) {
foreach ($control in $panel.Controls) {
$control.Checked = $false
}
}
然而,我无法让SHIFT+mouselick按我想要的方式操作,这就像文件资源管理器(即选中复选框选择一个项目,然后转到另一个项目并使用SHIFT+ mouselick,第一个到第二个之间的每个项目都将被选中)。
# Define the lastSelected variable
$lastSelected = $null
$checkboxMouseDown = {
param($sender, $eventArgs)
$checkbox = $sender
$isChecked = $checkbox.Checked
if ([System.Windows.Forms.Control]::ModifierKeys -band [System.Windows.Forms.Keys]::Shift) {
if ($lastSelected -and $lastSelected -ne $checkbox) {
$startIndex = [System.Array]::IndexOf($panel.Controls, $lastSelected)
$endIndex = [System.Array]::IndexOf($panel.Controls, $checkbox)
if ($startIndex -gt $endIndex) {
$startIndex, $endIndex = $endIndex, $startIndex
}
for ($i = $startIndex; $i -le $endIndex; $i++) {
$panel.Controls[$i].Checked = $isChecked
}
}
} else {
$lastSelected = $checkbox
}
Write-Host "Last selected: $lastSelected, Checked: $($checkbox.Checked)"
}
然后在构建表单的foreach
循环中,我有:
$panel.Add_MouseDown($checkboxMouseDown)
我自己解决了大部分问题(我不太擅长表单),但在过去的两天里我还没有找到解决这个问题的方法。如果能帮助我让Shift+鼠标点击以这种方式工作,我将不胜感激。
1条答案
按热度按时间pbwdgjma1#
挖掘了一下,我也想不出答案,不过,最后偶然发现了这篇文章:https://learn.microsoft.com/en-us/powershell/scripting/samples/multiple-selection-list-boxes?view=powershell-7.3
我不能让它与我写的脚本一起工作,但是,我复制了他们的代码并运行它,它确实做了你想要的。我按下shift+左键单击,它选择了多个项目。我很确定
$listBox.SelectionMode = 'MultiExtended'
行是什么使它成为可能。无论如何,希望这有帮助,如果没有,对不起。编辑:我没有给你找到一个答案,这让我很困扰,所以这里有一个更好的答案。
这对我来说没问题。