以编程方式添加列表框中的删除项目

时间:2014-03-09 10:50:12

标签: powershell user-interface listbox

我有三个列表框。让我们称呼listbox 2, 3 and 4

Listbox 2从按钮点击事件中获取计算机。然后,我创建了>><<按钮,以便在23之间移动它们。现在,当我从3中选择多台计算机并单击另一个名为check的按钮时,它应该检查我在3中选择的服务器是否可以ping通,并将它们移动到4如果ping成功,同时将其从3中删除。那些不可ping的人应该留在3

我一直在

  

此枚举器绑定的列表已被修改   只有在列表没有更改时才能使用枚举器。

这是我的代码: $ buttonCheckStatus_Click = {  $ CheckedServerS = $ listbox3.SelectedItems         foreach($ CheckedServer in $ CheckedServerS)         {

            If (!(Test-Connection -Cn $CheckedServer -BufferSize 16 -Count 1 -ea 0 -quiet) -eq $true)
            {
                $cSrvr = $CheckedServer
                $listbox4.BeginUpdate()
                foreach($s in $cSrvr)
                {
                    $listbox4.Items.Add($s)--->*****
                }
                $listbox4.EndUpdate()
            }
            elseif(!(Test-Connection -Cn $CheckedServer -BufferSize 16 -Count 1 -ea 0 -quiet) -eq $false)
            {
                [void][System.Windows.Forms.MessageBox]::Show("Server $CServers needs Reboot","msg2")
            }
        }
    }

以上工作正常,我在列表框3中获取了可以ping到列表框4的服务器,但是:只要在$listbox3.SelectedItems.remove()下面添加$listbox4.Items.Add($s)(上面标记为----> ***** )错误开始发生。

在阅读了一些帖子后,我知道我无法使用foreach。这就像吃蛋糕一样吃。但我无法弄清楚如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

它正在抱怨该声明,因为您仍在枚举listbox3.SelectedItems。解决这个问题的一种方法是记录数组中需要删除的内容,一旦你退出循环(将它们添加到listbox4),枚举该数组并从listbox3中删除项目。

所以添加

$Pingable=@()
在开始循环之前

。验证并将其添加到listbox4

后,将服务器添加到循环中的该数组中
$Pingable +=$s 

完成整个循环后;枚举数组并删除它们

foreach ($p in $Pingable) { $listbox3.Items.remove($p) }

在您的代码中:

$Pingable=@()
$buttonCheckStatus_Click={ $CheckedServerS=$listbox3.SelectedItems foreach ($CheckedServer in $CheckedServerS) {

            If (!(Test-Connection -Cn $CheckedServer -BufferSize 16 -Count 1 -ea 0 -quiet) -eq $true)
            {
                $cSrvr = $CheckedServer
                $listbox4.BeginUpdate()
                foreach($s in $cSrvr)
                {
                    $listbox4.Items.Add($s)
                    $Pingable +=$s
                }
                $listbox4.EndUpdate()
            }
            elseif(!(Test-Connection -Cn $CheckedServer -BufferSize 16 -Count 1 -ea 0 -quiet) -eq $false)
            {
                [void][System.Windows.Forms.MessageBox]::Show("Server $CServers needs Reboot","msg2")
            }
        }
    }

foreach ($p in $Pingable) { $listbox3.Items.remove($p) }