在Add_Click内部函数

时间:2019-06-09 22:34:47

标签: winforms powershell

$TextApp1 = "it works"

function DrawButton {

    $Temp = "$args"

    $ButtonType = Get-Variable -Name "Button$Temp" -Value

    $ButtonType | Add-Member -NotePropertyMembers @{ DataTemp = $Temp }

    $ButtonType.Add_Click({
        $Data = $($this.DataTemp)
        $DefaultForm.Text = "$Data"
    })

    $DefaultGroupBox.Controls.Add($ButtonType)

}

DrawButton App1

现在可以使用了mklement0

这使我离使事情变得更容易管理更近了一步,不知道您提供了多少帮助

约2,000行代码变成了约50行,而我现在每次想按下按钮时都不必重新制作50行代码

2 个答案:

答案 0 :(得分:1)

您的问题是事件处理程序在 script 范围的子范围(而不是函数的范围)中运行,因此它看不到$Temp变量。 换句话说:没有闭包可以捕获$Temp的值并使其在事件处理程序中可用。

虽然可以使用范围说明符$script:在脚本范围中设置变量,但通常应避免这种情况,并且在您的情况下,不会为您提供{{1 }}。

您最好的选择是使用DrawButton将所需的值作为自定义属性附加到按钮对象:

Add-Member

答案 1 :(得分:-1)

我认为您的问题与在调用DrawButton之后在本地声明$ button而不是在全局范围内声明生存有关。 不幸的是,PowerShell没有强制声明Is there an "Option Explicit" in PowerShell?

的好方法

另外,您可能有不正确的类型。  $ ButtonType初始化为字符串,但随后将其使用ButtonType.Add_Click作为按钮。

无论如何,只要学习如何调试代码(例如使用Visual Studio Code或PowerGui),就可以自己找到答案。