PowerShell + WinForms:复选框列表输出传递至主脚本数组时的数据丢失及填充异常问题求助
PowerShell + WinForms:复选框列表输出传递至主脚本数组时的数据丢失及填充异常问题求助
大家好,我最近在用PowerShell结合WinForms做一个小工具,想要通过循环把复选框的选中状态(布尔值)存到数组里,但遇到了两个棘手的问题,试了好几种写法都没搞定,想请各位大佬帮忙看看:
问题一:窗体关闭后数组数据完全丢失
不管我把数组声明在提交按钮的点击事件内部还是外部,在点击事件执行过程中,数组都能正确填充数据——我在循环里加了控制台输出,能看到每个复选框的状态都被正确存进去了,数组长度也对得上。但只要窗体一关闭,数组就直接变成空的,主脚本里根本拿不到这些数据。
问题二:全局数组填充结果异常
如果把数组声明成全局变量(比如$global:arrayGlobal),填充出来的结果完全不符合预期:本该是对应每个复选框的布尔值序列,结果变成前面几个元素是空的,最后一个元素是所有复选框文本拼在一起的字符串?(比如测试里的ApplePearOrange)但如果把数组声明在点击事件内部,填充是正常的,只是还是逃不过窗体关闭后数据丢失的问题。
下面是我用来测试的完整脚本,以及对应的控制台输出,方便大家复现问题:
测试脚本
Clear-Host # Define a global array $global:arrayGlobal = @() # Path to the data file $dataFile = "D:\Path\To\Some\Data.txt" # Parse text file to get data $listNames = Get-Content $dataFile | ForEach-Object { ($_ -split '=')[0].Trim() } Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # Create a form $form = New-Object System.Windows.Forms.Form $form.Text = "Example Form" $form.Size = New-Object System.Drawing.Size(300,500) $form.StartPosition = "CenterScreen" $form.Topmost = $true # Create checkboxes for each item $verticalPosition = 30 # Initial vertical position for checkboxes foreach ($item in $listNames) { $checkBox = New-Object System.Windows.Forms.CheckBox $checkBox.Text = $item $checkBox.AutoSize = $true $checkBox.Location = New-Object System.Drawing.Point(20, $verticalPosition) $form.Controls.Add($checkBox) $verticalPosition += 25 # Increment to space checkboxes vertically } # Add a button to submit selection $submitButton = New-Object System.Windows.Forms.Button $form.AcceptButton = $submitButton $submitButton.Text = "Submit" $submitButton.Location = New-Object System.Drawing.Point(100,350) $submitButton.Add_Click({ $items = $form.Controls | Where-Object { $_.GetType() -eq [System.Windows.Forms.CheckBox] } Write-Host "Check 1 (total on Click): $($items.Length)" # Define another array inside the Click event to compare $arrayCompare = @() for ($i = 0; $i -lt $items.Length; $i++) { $item = $items[$i] $arrayGlobal += $item.Checked $arrayCompare += $item.Checked Write-Host = "Check 2 (For Each):" $item.Checked } Write-Host "Check 3:" $arrayGlobal.Count "items in Global Array" Write-Host "Check 3:" $arrayCompare.Count "items in Comparison Array" # CloseForm $form.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.Close() }) $form.Controls.Add($submitButton) # Display the form $form.ShowDialog() Write-Host "Check 4:" $arrayGlobal.Count "items in Global Array" Write-Host "Check 4:" $arrayCompare.Count "items in Comparison Array" Write-Host "Global Array:" $arrayGlobal
控制台输出
Check 1 (total on Click): 9 = Check 2 (For Each): False = Check 2 (For Each): True = Check 2 (For Each): True = Check 2 (For Each): True = Check 2 (For Each): False = Check 2 (For Each): False = Check 2 (For Each): False = Check 2 (For Each): False = Check 2 (For Each): False Check 3: 1 items in Global Array Check 3: 9 items in Comparison Array OK Check 4: 0 items in Global Array Check 4: 0 items in Comparison Array Global Array:
从输出能看到,点击事件里$arrayCompare是正常的9个元素,但$arrayGlobal居然只有1个?而且窗体关闭后两个数组直接全空了……
有没有大佬能帮忙分析下问题出在哪,或者给个可行的解决思路呀?万分感谢!
备注:内容来源于stack exchange,提问作者Alex Boisot
相关产品推荐
相关产品推荐

