Развернуть все переменные внутри функции Add_Click Inside - PullRequest
1 голос
/ 10 июня 2019
$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

. Это сделало меня еще на один шаг ближе к тому, чтобы упростить управление, и вы даже не представляете, как сильно вы помогли

~ 2000 строк кода превратились в ~ 50, и мне не нужно переделывать 50 строк кода каждый раз, когда я хочу сделать кнопку сейчас

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Ваша проблема в том, что обработчик событий выполняется в дочерней области действия script , а не в вашей функции, поэтому он не видит переменную $Temp.Другими словами: нет замыкания, которое бы захватывало значение $Temp и делало бы его доступным в обработчике событий.

Хотя в области действия скрипта можно задавать переменные с помощью спецификатора области действия $script:,Обычно этого следует избегать, и в вашем случае вы бы не указали отдельные значения, характерные для каждого вызова DrawButton.

. Лучше всего ставить желаемое значение для объекта кнопки в виде пользовательское свойство , используя Add-Member:

function DrawButton {

    $Temp = "$args"

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

    # Add the value of $Temp as custom property .CustomProperty to the
    # button object.
    $ButtonType | Add-Member -NotePropertyMembers @{ CustomProperty = $Temp }

    $ButtonType.Add_Click({
        # $this refers to the button object; extract the custom property's value
        $DefaultForm.Text = "Text$($this.CustomProperty)"
    })

    $DefaultGroupBox.Controls.Add($ButtonType)
    $ButtonType.Cursor = $HandCursor

}
0 голосов
/ 10 июня 2019

Я думаю, что ваша проблема связана с тем, что вы объявили кнопку $ локально, а не глобально, чтобы жить после вызова DrawButton. К сожалению, в PowerShell нет хорошего способа принудительного объявления Есть ли в PowerShell «Явный параметр»?

Также, возможно, у вас неправильные типы. $ ButtonType инициализируется как строка, но затем вы используете ее ButtonType.Add_Click в качестве кнопки.

В любом случае узнайте, как отлаживать код (например, с помощью кода Visual Studio или PowerGui), и вы сможете найти ответы самостоятельно.

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