Windows窗体关闭时,ArrayList意外清空?

时间:2013-01-29 23:40:29

标签: .net powershell

我正在创建一个PowerShell函数,用于使用GUI在AD中搜索用户。该函数将ShowDialog()一个Windows窗体供用户进行搜索,然后当用户单击OK时窗体关闭,函数将返回一个包含所选AD用户的ArrayList。

在表单关闭之前,一切正常。表单关闭后,我的ArrayList突然计数为0,而不是包含他们选择的AD用户。

我无法理解为什么ArrayList($ alRetrievedSelection)被清空了。我实际上只有一行代码可以修改这个ArrayList。其他一切只是我自己的调试目的的写警告。

#This function returns an arraylist that contains the items selected by the user
function Retrieve-DataGridSelection{...}

#Fake sample data
$array = "Item 1","Item 2","Item 3","Item 4"
$arraylist = New-Object System.Collections.ArrayList(,$array)

#Create the basic form
$frmWindow = New-Object System.Windows.Forms.Form

#Create the OK button
$btnOK = New-Object System.Windows.Forms.Button
$btnOK.Add_Click({
    $alRetrievedSelection = Retrieve-DataGridSelection -dgDataGridView $datagrid
    #This warning always shows the correct Count
    Write-Warning("Received from Retrieve-DataGridSelection: " + $alRetrievedSelection.Count)
})
$frmWindow.Controls.Add($btnOK)

#Create the datagrid where users will select rows
$datagrid = New-object System.Windows.Forms.DataGridView
$datagrid.DataSource = $arraylist
$frmWindow.Controls.Add($datagrid)

#Give focus to the form
$frmWindow.Add_Shown({$frmWindow.Activate()})

#Display the form on the screen
$frmWindow.ShowDialog()

#This warning keeps telling me the Count is 0 when it should not be
Write-Warning("After the form closes: " + $alRetrievedSelection.Count)

1 个答案:

答案 0 :(得分:0)

这是由于PS的范围规则。来自Get-Help about_Scopes

  

[我] tems你创造和改变   除非您明确说明,否则在子范围内不会影响父范围   在创建项目时指定范围。

这意味着当您在Click处理程序脚本块(相当于C#lambda)中设置变量时,只能在该块的本地范围内设置它,而不是全局范围。

要在全局范围内设置变量,请使用global范围修饰符:

$global:alRetrievedSelection = Retrieve-DataGridSelection …