我有三个列表框。让我们称呼listbox 2, 3 and 4
。
Listbox 2
从按钮点击事件中获取计算机。然后,我创建了>>
和<<
按钮,以便在2
和3
之间移动它们。现在,当我从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
。这就像吃蛋糕一样吃。但我无法弄清楚如何实现这一目标。
答案 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) }