Передача индекса функции в powershell - PullRequest
0 голосов
/ 31 марта 2020

В powershell внутри foreach я генерирую несколько кнопок, и каждая кнопка должна вызывать функцию, передающую ее индекс в качестве аргумента, но кажется, что вы не можете передать индекс в функцию.

$RacesButtons = @()
for( $i=0; $i -lt $numRaces; $i++ ){
    $button = New-Object System.Windows.Forms.Button
    $RacesButtons = $RacesButtons + $button
    $RacesButtons[$i].Text = "$($RacesFiles[$i])"
    $RacesButtons[$i].Add_Click({NewNpc $i})
    $Form.Controls.Add($RacesButtons[$i])
}

Это должно передайте значение от 0 до 8 ($ numRaces равно 9), но вместо этого передается значение NULL, и я получаю эту ошибку.

Indexing operation failed. The index value of the matrix is null.
 In C:\Users\Marco\Desktop\Music&Npc\Music&Npc.ps1:137 car:2
+     $NpcDetailsTextBox.Text = $RacesFiles[$race]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex

«NpcDetailsTextBox» - это текстовое поле, а «RacesFiles» - это массив. Странно то, что текст каждой кнопки (установленной с помощью $ RacesButtons [$ i] .Text = "$ ($ RacesFiles [$ i])" перед установкой add_click) является правильным.

Я получаю та же ошибка с

$RacesButtons[$i].Add_Click({NewNpc $($i)})

Но если я использую один из этих

$RacesButtons[$i].Add_Click({NewNpc "$i"})
$RacesButtons[$i].Add_Click({NewNpc "$($i)"})

, он не возвращает ошибку, но каждая кнопка передает 0 функции.

Любые идеи о том, как я могу решить это? Заранее спасибо

1 Ответ

1 голос
/ 31 марта 2020

Причина этого в том, что внутри блока сценария для Add_Click переменная $i неизвестна ($ null). В этом случае я бы go предложил простое решение и использовал бы собственное свойство кнопок Tag, чтобы сохранить текущее значение $i

$RacesButtons = for( $i = 0; $i -lt $numRaces; $i++ ){
    $button = New-Object System.Windows.Forms.Button
    $button.Text = "$($RacesFiles[$i])"
    # store the value of $i in the button's Tag property so it will be kept
    $button.Tag  = $i
    $button.Add_Click({ NewNpc $this.Tag })
    $Form.Controls.Add($button)
    # output the new button so it gets collected in the $RacesButtons array
    $button
}

Надеюсь, что это поможет

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