仅将AD组成员加载ComboBox一次

时间:2017-05-02 10:23:00

标签: forms winforms powershell combobox active-directory

我正在开发Powershell中的新用户创建表单。我正在使用ComboBox,以便表单的用户可以从列表中选择新用户的直线管理器。管理器列表是从Active Directory中的安全组中提取的。有很多成员因此加载需要几秒钟,每次打开ComboBox时都会发生此延迟。我的代码如下:

function Load-ComboBox-Managers
{
    $MgrComboBox.Items.Clear()
    $MgrArray = Get-ADGroupMember -Identity "All Managers" | 
    Select-Object Name
    ForEach ($item in $MgrArray) {
        $MgrComboBox.Items.Add($item.Name)}
}

我的问题是,是否可以在ComboBox第一次下拉时运行该函数,然后将该列表存储在某处并在每次打开ComboBox时引用该存储列表,而不是查询AD每一次?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题似乎是您有一个不需要的点击事件。如果您只想在整个代码中调用此函数一次,则需要删除click事件并将ComboBox的项设置一次。之后,它们将保持不变,直到实例结束或重置它们。

您的代码:

function Load-ComboBox-Managers{
    $MgrComboBox.Items.Clear()
    $MgrArray = Get-ADGroupMember -Identity "All Managers" | 
    Select-Object Name
    ForEach ($item in $MgrArray) {
        $MgrComboBox.Items.Add($item.Name)}
}

$MgrComboBox.Add_Click({ Load-ComboBox-Managers })  #This line causes reinitialization

更改了代码:

function Load-ComboBox-Managers{
    $MgrComboBox.Items.Clear()
    $MgrArray = Get-ADGroupMember -Identity "All Managers" | 
    Select-Object Name
    ForEach ($item in $MgrArray) {
        $MgrComboBox.Items.Add($item.Name)}
}
#Call the function to set the ComboBox items
Load-ComboBox-Managers

此外,如果您的代码需要,您可以设置一个变量来保存ComboBox将描述的项目列表,但我不认为这是您要使用的方法。

$var = @()  #or
$Global:var = @()