You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中DateTimePicker值跨函数复用的全局变量问题

解决WinForm DateTimePicker全局变量在函数间复用的问题

我帮你梳理下代码里的问题,搞定全局变量跨函数复用的事儿:

问题根源

  1. 函数定义顺序错了:你在调用MakeForm之后才定义GetData,按钮点击触发GetData时这个函数还没被PowerShell识别,直接会报错,这大概率是你觉得变量为空的核心原因。
  2. 变量名大小写笔误:设置起始日期控件格式时,你把$Global:txtStartDate写成了$Global:txtstartDate(小写s),这会创建一个无关的新变量,原控件的格式设置等于白做。
  3. 控件集合混入未定义变量:添加控件到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:50