Есть ли лучший способ создать переменное количество полей ввода на форме с помощью Powershell? - PullRequest
0 голосов
/ 17 мая 2019

Из-за ограничений работы я использую Powershell для написания скрипта, который автоматизирует повторяющиеся задачи ввода данных в веб-форме. Один раздел веб-формы позволяет пользователю вводить столько новых «вех», сколько они хотят. Мой сценарий предполагает количество новых этапов по умолчанию со значениями.

Чтобы сценарий можно было повторно использовать без значительных правок (при условии, что значения по умолчанию недостаточно хороши), я хотел дать пользователю возможность создать форму с любым количеством текстовых полей, которые ему нужны.

После поиска в Интернете единственные ответы, которые я видел, опубликованные специально для форм Powershell, требовали ручного повторения меток и текстовых полей. То есть если вы хотите два поля ввода, то вы кодируете два поля ввода.

Никто, кажется, не создал успешно форму с переменным количеством полей ввода, используя Powershell. (Я продолжаю говорить о PS, потому что думаю, что это будет тривиальной проблемой с другими языками, но я не могу использовать их на моем рабочем ПК).

Код позволяет пользователю вначале ввести желаемое количество полей в переменную, а затем выполнить цикл for, чтобы добавить это количество полей и меток. Внутри цикла for фиктивная переменная создается как новый объект типов «Forms.Label» и «Forms.Textbox». Я обновляю свойства фиктивной переменной, затем использую новую переменную, чтобы установить имя и значение динамической переменной, равные манекену. Я добавляю его в форму, используя переменную get.

Присвоение переменной количества полей еще одной форме позволит пользователю динамически вводить сколько угодно, вместо того, чтобы жестко кодировать значение.


function variable_form()
{

     #number of fields
     $nof = 3

     #base form
     $form = New-Object System.Windows.Forms.Form
     $yspace = $nof*100
     $xspace = 500
     $form.Size = "$xspace,$yspace"
     $form.Text = "Test"
     $form.StartPosition = 'CenterScreen'
     #end base form

     $ypos = 0

     #populate with labels and text fields
     $xvspace = $xspace - 50
     for ($i = 1; $i -le $nof; $i++)
     {
        $var = New-Object System.Windows.Forms.Label
        $ypos += 30
        $var.Location = "25,$ypos"
        $var.AutoSize = $true
        $var.Text = "Field Label $i"
        New-Variable -Name "Label$i" -Scope "Script" -Value $var
        $form.Controls.Add((Get-Variable -Name "Label$i" -ValueOnly))
        $var = New-Object System.Windows.Forms.TextBox
        $ypos += 20
        $var.Location = "25,$ypos"
        $var.Size = "$xvspace,20"
        New-Variable -Name "textbox$i" -Scope "Script" -Value $var
        $form.Controls.Add((Get-Variable -Name "textbox$i" -ValueOnly))
     }

    #create an OK button
    $OKButton = New-Object System.Windows.Forms.Button
    $ypos += 30 
    $xpos = $xspace / 2
    $xpos -= 70
    $OKButton.Location = "$xpos,$ypos"
    $OKButton.AutoSize = $true
    $OKButton.Text = 'OK'
    $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $OKButton
    $form.Controls.Add($OKButton)
    #end OK button

    #create a cancel button
    $CancelButton = New-Object System.Windows.Forms.Button
    $xpos += 75
    $CancelButton.Location = "$xpos,$ypos"
    $CancelButton.AutoSize = $true
    $CancelButton.Text = 'Cancel'
    $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $CancelButton
    $form.Controls.Add($CancelButton)
    #end cancel button

    #resize form
    $yspace = $ypos + 80
    $form.Size = "$xspace, $yspace"
    #end resize

    $form.Topmost = $true

    $form.Add_Shown({$form.Activate()})
    $result = $form.ShowDialog()
    if ($result -eq [System.Windows.Forms.DialogResult]::OK){   
        $Script:count = 0
        for ($i = 1; $i -le $nof; $i++)
        { 
            $val = Get-Variable -Name "textbox$i" -ValueOnly
            #get a count of actual new milestones
            if( $val.Text ){
                $count += 1
                New-Variable -Name "MS_txt$count" -Scope "Script" -Value $val.Text
            }
        }

    }       
}

Есть ли лучший способ сделать это?

Код создаст форму с любым количеством полей и позволит другим функциям использовать этот код (о чем свидетельствует финальный цикл for). Я знаю только достаточно компьютерного программирования, чтобы быть опасным, и думал, что спрошу экспертов.

Мне не нравится переназначать одну и ту же переменную новому объекту; Я попытался удалить-переменную -Name $ var после добавления элементов управления формы, но это всегда приводило к ошибке.

* Примечание: связанная, но отдельная тема - этот код в конечном итоге приведет к зависанию и аварийному завершению работы Powershell ISE. Мне неясно, что я делаю не так, что вызывает эту проблему.

...