Windows 窗体 - 在按钮单击 [复制] 时将数据添加到列表视图

Windows forms - add data to list view on button click [duplicate]

提问人:BenDK 提问时间:8/26/2019 最后编辑:BenDK 更新时间:10/28/2021 访问量:557

问:

我有一个 winform 应用程序,在我单击后填充一些数据,如何添加存储在变量中的数据,单击该按钮后可用?$button_UpdateTS

我想要在列表视图中的数据存储在一个名为$results

$button_UpdateTS = New-Object System.Windows.Forms.Button
$button_UpdateTS.Location = New-Object System.Drawing.Size(15, 954)
$button_UpdateTS.Size = New-Object System.Drawing.Size(320, 32)
$button_UpdateTS.TextAlign = "MiddleCenter"
$button_UpdateTS.Text = “Update Tasksequence”
$button_UpdateTS.Add_Click( { $Results = Set-DynamicVariables 
-Manufacturer "$($listview_Vendor.SelectedItems)" 
-TSPackageID "$($ListView_Tasksequences.SelectedItems.SubItems[1].Text)" -WhatIf })
    $Form.Controls.Add($button_UpdateTS)

这给了我:

$Results = 
SKUNotExistsDriverName    : XPS Notebook 9560
SKUNotExistsDriverID      : PS10053F
SKUNotExistsDriverSKU     : 07BE
SKUNotExistsDriverVersion : A12
SKUNotExistsBIOSName      : XPS Notebook 9560
SKUNotExistsBIOSID        : PS10053E
SKUNotExistsBIOSSKU       : 07BE
SKUNotExistsBIOSVersion   : 1.15.0

这是我希望它存储在其中的列表:

$Global:listview_NotExists_SKU = New-Object System.Windows.Forms.ListView
$listview_NotExists_SKU.Location = New-Object System.Drawing.Size(515, 670)
$listview_NotExists_SKU.Size = New-Object System.Drawing.Size(486, 235)
$listview_NotExists_SKU.View = "Details"
$listview_NotExists_SKU.FullRowSelect = $true
$listview_NotExists_SKU.MultiSelect = $true
$listview_NotExists_SKU.Sorting = "None"
$listview_NotExists_SKU.AllowColumnReorder = $true
$listview_NotExists_SKU.GridLines = $true
$listview_NotExists_SKU.Add_ColumnClick( { SortListView $this $_.Column })
$Form.Controls.Add($listview_NotExists_SKU)

我尝试过这个功能,但不起作用:

Function Get-Results {
        ForEach ($Result in $Results) {
            $listview_NotExists_SKU.Items.Add($Result) 
       }
}

$Form.Add_Shown( { $Form.Load; Get-results })
WinForms PowerShell

评论


答:

1赞 mklement0 8/26/2019 #1

因为事件处理脚本块添加了例如.Add_Click() 在调用方的作用域中运行,将变量赋值给 there() 创建一个作用域局部变量,在该变量中设置事件处理程序的作用域和随后调用的事件处理程序都无法看到该变量。$Results$Results = ...

若要在脚本作用域中创建一个变量,随后调用的事件处理程序也可以看到它[1],请使用作用域说明符:$script:

$button_UpdateTS.Add_Click( { $script:Results = ... } )

注意:

  • 如果设置事件处理程序的作用域不是脚本作用域(例如,如果代码位于函数内部),并且您希望从事件处理程序中更通用地引用父作用域,请使用 Set-Variable -Scope 1 -Name Results -Value ...[1]

  • 在父作用域中显式设置变量的替代方法是使用在父作用域中定义的哈希表,该哈希表的条目可用于代替事件处理程序脚本块也可以修改的变量。[2] 有关示例,请参阅此答案


[1] 有关 PowerShell 中范围的详细信息,请参阅此答案的底部。

[2] 此技术有效,因为即使包含哈希表的变量在作用域中定义,子作用域也可以访问其值并修改引用的哈希表对象的条目,而不是变量本身。

评论

0赞 Santiago Squarzon 10/28/2021
好吧,我正要问这个问题,但我看到你已经更新了你的答案。我知道子作用域可以看到父作用域变量的值,通常它无法更新其值,但是为什么或如何子作用域(使用哈希表时)可以更新哈希表键的值,甚至添加/删除键?如果在这里回答太麻烦了,我绝对可以问一个新问题,但我很想知道为什么会这样做。
0赞 mklement0 10/28/2021
@SantiagoSquarzon,脚注 [2] 旨在回答您的问题 - 如果您告诉我它不足的地方,我很乐意改进它。请注意变量对象和它引用的对象之间的区别。
0赞 Santiago Squarzon 10/28/2021
是的,脚注解释说它(子作用域)可以修改它的成员,但为什么它能够这样做?
1赞 mklement0 10/28/2021
@SantiagoSquarzon,后代作用域可以获取祖先作用域中变量的值。如果此类变量的值是可变对象(例如哈希表),则修改该对象也会显示在祖先范围的变量(值)中。
1赞 mklement0 10/28/2021
不客气,@SantiagoSquarzon。值类型与引用类型的二分法是一个很好的经验法则:值类型通常是不可变的,正如官方推荐的那样,但从技术上讲,它们可以是可变的。