WinForm中DateTimePicker值跨函数复用的全局变量问题
解决WinForm DateTimePicker全局变量在函数间复用的问题
我帮你梳理下代码里的问题,搞定全局变量跨函数复用的事儿:
问题根源
- 函数定义顺序错了:你在调用
MakeForm之后才定义GetData,按钮点击触发GetData时这个函数还没被PowerShell识别,直接会报错,这大概率是你觉得变量为空的核心原因。 - 变量名大小写笔误:设置起始日期控件格式时,你把
$Global:txtStartDate写成了$Global:txtstartDate(小写s),这会创建一个无关的新变量,原控件的格式设置等于白做。 - 控件集合混入未定义变量:添加控件到Form时,你写了
$StartDate和$EndDate这俩从没定义的变量,会导致Form加载失败。
修正后的完整代码
Set-strictMode -off [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") [System.Windows.Forms.Application]::EnableVisualStyles() Add-Type -AssemblyName System.Web [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" # 初始化全局变量 $global:startDate = $null $global:endDate = $null # 先定义GetData,确保调用前函数已存在 function GetData{ # 第一处复用全局变量的逻辑 Write-Output "This is the first example: from $global:startDate to $global:endDate" # 第二处复用全局变量的逻辑 Write-Output "This is the second example: from $global:startDate to $global:endDate" } function MakeForm{ #region 构建GUI $Form = New-Object system.Windows.Forms.Form $Form.ClientSize = '396,180' $Form.text = "Rexpii Integrations Version (Beta)" $Form.BackColor = "#ffffff" $Form.TopMost = $False $Form.Icon= [System.Drawing.Icon]::ExtractAssociatedIcon('C:\files\scripts\tpgicon.ico') $btnSubmit = New-Object system.Windows.Forms.Button $btnSubmit.text = "Submit" $btnSubmit.width = 60 $btnSubmit.height = 30 $btnSubmit.location = New-Object System.Drawing.Point(220,116) $btnSubmit.Font = 'Microsoft Sans Serif,10' $btnSubmit.Add_Click({ # 给全局变量赋值,确保引用正确的DateTimePicker控件 $global:startDate = $Global:txtStartDate.Value.ToString("yyyy-MM-dd") $global:endDate = $Global:txtEndDate.Value.ToString("yyyy-MM-dd") # 调用已定义好的GetData GetData $Form.Close() }) $btnCancel = New-Object system.Windows.Forms.Button $btnCancel.text = "Cancel" $btnCancel.width = 60 $btnCancel.height = 30 $btnCancel.location = New-Object System.Drawing.Point(288,116) $btnCancel.Font = 'Microsoft Sans Serif,10' $btnCancel.Add_Click({ $Form.Close() }) $Global:txtStartDate = New-Object system.Windows.Forms.DateTimePicker $Global:txtStartDate.width = 150 $Global:txtStartDate.location = New-Object System.Drawing.Point(208,40) $Global:txtStartDate.Format = "Custom" # 修正大小写错误,确保格式设置到正确控件上 $Global:txtStartDate.CustomFormat = "yyyy-MM-dd" $Global:txtEndDate = New-Object system.Windows.Forms.DateTimePicker $Global:txtEndDate.width = 150 $Global:txtEndDate.location = New-Object System.Drawing.Point(208,80) $Global:txtEndDate.Format="Custom" $Global:txtEndDate.CustomFormat = "yyyy-MM-dd" # 补充你代码里缺的标签控件,否则AddRange会报错 $lblStartDate = New-Object system.Windows.Forms.Label $lblStartDate.Text = "Start Date:" $lblStartDate.Location = New-Object System.Drawing.Point(40,45) $lblEndDate = New-Object system.Windows.Forms.Label $lblEndDate.Text = "End Date:" $lblEndDate.Location = New-Object System.Drawing.Point(40,85) # 移除未定义的变量,添加正确的控件 $Form.controls.AddRange(@($btnSubmit,$btnCancel,$lblStartDate,$lblEndDate,$txtStartDate, $txtEndDate)) [void]$Form.ShowDialog() } # 最后调用Form显示界面 MakeForm
关键修正说明
- 调整函数顺序:把
GetData移到MakeForm前面定义,保证按钮点击时函数已经可用。 - 修正变量大小写:统一控件变量名的大小写,确保格式设置生效。
- 修复控件集合:补上缺失的标签控件,删掉未定义的无效变量,保证Form正常加载。
- 全局变量作用域:在事件处理里明确用
$global:前缀赋值,确保变量在全局作用域生效,后续函数能正常读取。
改完之后,点击Submit按钮,日期值会正确存入全局变量,GetData里就能多次复用这些值了。
内容的提问来源于stack exchange,提问作者Lilith Mae
相关产品推荐
相关产品推荐

