Использование переменных для событий в динамически генерируемом элементе управления - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть функция Add-TextBox, которая создает элемент управления TextBox и назначает блок его обработчику событий.

Проблема, с которой я сталкиваюсь, заключается в том, что этот блок, вероятно, вызывается с глобальным пространством имени переменные, объявленные внутри функции Add-TextBox, ей недоступны.Как мне сделать их доступными?

Редактировать : добавлен полный код

Add-Type -AssemblyName System.Windows.Forms

Function Add-Control() {
    Param (
        [System.Windows.Forms.Form]$Form,
        [string]$ControlType,
        [System.Windows.Forms.Control]$AfterControl = $null,
        [int]$Padding = 0
    )

    $control = New-Object System.Windows.Forms.$ControlType

    $control.AutoSize = $true

    $x = 5
    $y = 5

    if ($AfterControl) {
        $y = $AfterControl.Location.Y + $AfterControl.Size.Height + $Padding
    }

    $control.Location = "5,$y"

    $form.Controls.Add($control)

    return $control
}

Function Add-TextBox() {
    Param (
        [System.Windows.Forms.Form]$Form,
        [string]$Placeholder = "",
        [System.Windows.Forms.Control]$AfterControl = $null,
        [int]$Padding = 0
    )

    $control = Add-Control -Form $Form -ControlType "TextBox" -AfterControl $AfterControl -Padding $Padding

    $control.Add_GotFocus({
        Write-Host "Placeholder is null: $($Placeholder -eq $null)"
        if ($this.Text -eq $Placeholder) {
            $this.ForeColor = "Black"
            $this.Text = ""
        }
    })

    $control.Add_LostFocus({
        if ($this.Text -eq "") {
            $this.ForeColor = "Darkgray"
            $this.Text = $Placeholder
        }
    })

    return $control
}

$form = New-Object system.Windows.Forms.Form

$textbox = Add-TextBox -Form $form -Placeholder "(XXXXXX, npr. 012345)"

$form.ShowDialog()

1 Ответ

0 голосов
/ 25 апреля 2018

Кажется, я могу использовать .GetNewClosure() в блоках скрипта для захвата локальных переменных и их сохранения.

Add-Type -AssemblyName System.Windows.Forms

Function Add-Control() {
    Param (
        [System.Windows.Forms.Form]$Form,
        [string]$ControlType,
        [System.Windows.Forms.Control]$AfterControl = $null,
        [int]$Padding = 0
    )

    $control = New-Object System.Windows.Forms.$ControlType

    $control.AutoSize = $true

    $x = 5
    $y = 5

    if ($AfterControl) {
        $y = $AfterControl.Location.Y + $AfterControl.Size.Height + $Padding
    }

    $control.Location = "5,$y"

    $form.Controls.Add($control)

    return $control
}

Function Add-TextBox() {
    Param (
        [System.Windows.Forms.Form]$Form,
        [string]$Placeholder = "",
        [System.Windows.Forms.Control]$AfterControl = $null,
        [int]$Padding = 0
    )

    $control = Add-Control -Form $Form -ControlType "TextBox" -AfterControl $AfterControl -Padding $Padding

    $control.Add_GotFocus({
        if ($this.Text -eq $Placeholder) {
            $this.ForeColor = "Black"
            $this.Text = ""
        }
    }.GetNewClosure()) # Here...

    $control.Add_LostFocus({
        if ($this.Text -eq "") {
            $this.ForeColor = "Darkgray"
            $this.Text = $Placeholder
        }
    }.GetNewClosure()) # And here.

    return $control
}


$form = New-Object system.Windows.Forms.Form

$textbox = Add-TextBox -Form $form -Placeholder "(XXXXXX, npr. 012345)"

$form.ShowDialog()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...