我正在为一些PowerShell构建一个GUI,它将为我工作的多站点组织创建资源邮箱。
表单中有两个ComboBox。第一个cboAgencies
是从嵌套的哈希表中填充的。 This one, actually.第二个cboOffices
填充了cboAgencies
中所选代理机构的位置。
使用.Add_SelectionChanged()
作为事件,我尝试将所选项目写入变量并执行其他一些操作,包括使用新选择的条件再次查询hash_AgencyOffices
以填充下一个ComboBox。 / p>
以下是对此特定问题非常重要的代码:
$arr_Agencies = ($hash_AgencyOffices['Agency2','Agency1'].Keys | Sort-Object)
$arr_Agencies | ForEach-Object {
$cboAgencies.Items.Add($_) | Out-Null
}
$cboAgencies.Add_SelectionChanged({
$selectedAgency = $cboAgencies.SelectedItem.ToString()
})
问题是,$selectedAgency
永远不会从cboAgencies
获取所选项目。我可以检查$ cboDivisons.SelectedItem和$ cboAgencies.SelectedItem.ToString()并且它们都正确返回在UI中选择的项目,但该值未传递给$ selectedAgency。
我已尝试使用和不使用.ToString()部分,但这似乎没有什么区别。
我也读过一些关于装订的内容,但我仍然不确定这是否是"正确的"这样做的方法。
答案 0 :(得分:2)
将我的评论转化为答案:
您可能会遇到范围问题;对于一个简单的演示,这段代码:
$a = 1
function test { $a = 2 }
test
$a
将设置$a
的值,创建一个更改它的函数,调用该函数,然后..显示它没有更改。会发生什么是$a = 2
在函数范围内创建一个名为$a
的新变量,将其设置为2
,然后在函数退出时抛弃它。
在您的代码中,尝试替换$Script:SelectedAgency
以使其明确更新外部变量('脚本范围')。对此的演示是:
$a = 1
function test { $script:a = 2 }
test
$a
我还没有对任何人进行过这样的比喻,但我想到的是带有玻璃圆顶(城市,公园,温室等)的科幻景观。如果你将一个变量气球浮在外面,它会在天空中升起,每个人都可以看到它(这类似于全局或脚本范围)。进入圆顶,向上看,你看到外面的气球。
但如果你试图漂浮另一个气球供所有人看,它会被玻璃屋顶困住。你向上看,可以看到你的本地气球覆盖在外面的全球气球前面,所以它看起来几乎和你一样,但是外面或其他圆顶的其他人看不到它,他们看到原来的气球在天空中。除非您使用$script:
或$global:
明确地将新内容推送到外面,否则其他人也可以看到它。
令人讨厌的微妙延伸,你可能会继续前行,然后跳过这个:
$a = 1
$b = @(1,2,3)
function test {
$a = 2
$b[0] = 2
}
test
如果你想象气球上的东西是你的东西所在的建筑物的邮政编码,那么看到天空中气球的人会去一栋楼。看到气球被困在你的圆顶上的人阻挡了外面的气球,可以转到另一个建筑物,这是更具体和相关的。但是一旦你到达建筑物,你可以移动你的东西。
所以$a = 2
试图浮动一个新的邮政编码气球,而不是每个人都看到它。但是$b[0] = 2
说“转到$b
的全局邮政编码,然后更改”。每个去同一栋楼的人都会看到你对这些东西做出的改变,你没有更新名称 $b
本身,所以没有范围问题。