Включить и отключить текстовые поля в Powershell

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

Редактировать с кодом

<# This form was created using POSHGUI.com  a free online gui designer for PowerShell
.NAME
    Ticket Request
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

#region begin GUI{ 

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '600,400'
$Form.text                       = "Ticket Request Form"
$Form.TopMost                    = $false

$image = [System.Drawing.Image]::Fromfile('G:\My Drive\CLASD Tech\CL Logos\CL_Lion.png')     
$pictureBox = new-object Windows.Forms.PictureBox 
$pictureBox.width=320
$pictureBox.height=240
$pictureBox.top=10
$pictureBox.left=375
#$pictureBox.Right=5
$pictureBox.Image=$image

$Label1                          = New-Object system.Windows.Forms.Label
$Label1.text                     = "Email"
$Label1.AutoSize                 = $true
$Label1.width                    = 25
$Label1.height                   = 10
$Label1.location                 = New-Object System.Drawing.Point(25,78)
$Label1.Font                     = 'Microsoft Sans Serif,10'

$Label2                          = New-Object system.Windows.Forms.Label
$Label2.text                     = "Request Type"
$Label2.AutoSize                 = $true
$Label2.width                    = 25
$Label2.height                   = 10
$Label2.location                 = New-Object System.Drawing.Point(25,114)
$Label2.Font                     = 'Microsoft Sans Serif,10'

$Label3                          = New-Object system.Windows.Forms.Label
$Label3.text                     = "Subject"
$Label3.AutoSize                 = $true
$Label3.width                    = 25
$Label3.height                   = 10
$Label3.location                 = New-Object System.Drawing.Point(25,152)
$Label3.Font                     = 'Microsoft Sans Serif,10'

$Label4                          = New-Object system.Windows.Forms.Label
$Label4.text                     = "Description"
$Label4.AutoSize                 = $true
$Label4.width                    = 25
$Label4.height                   = 10
$Label4.location                 = New-Object System.Drawing.Point(25,195)
$Label4.Font                     = 'Microsoft Sans Serif,10'

$TextBox1                        = New-Object system.Windows.Forms.TextBox
$TextBox1.multiline              = $false
$TextBox1.width                  = 100
$TextBox1.height                 = 20
$TextBox1.location               = New-Object System.Drawing.Point(-12,-19)
$TextBox1.Font                   = 'Microsoft Sans Serif,10'


$email                           = New-Object system.Windows.Forms.TextBox
$email.multiline                 = $false
$email.width                     = 267
$email.height                    = 20
$email.location                  = New-Object System.Drawing.Point(122,74)
$email.Font                      = 'Microsoft Sans Serif,10'
$email.Text                      = (Get-ADUser $env:USERNAME -Properties mail).mail
#$email.AppendText("@clasd.net")
$email.ReadOnly                 = 'true'

$subject                         = New-Object system.Windows.Forms.TextBox
$subject.multiline               = $false
$subject.width                   = 267
$subject.height                  = 20
$subject.location                = New-Object System.Drawing.Point(122,147)
$subject.Font                    = 'Microsoft Sans Serif,10'

$description                        = New-Object system.Windows.Forms.TextBox
$description.multiline              = $true
$description.width                  = 267
$description.height                 = 163
$description.location               = New-Object System.Drawing.Point(122,190)
$description.Font                   = 'Microsoft Sans Serif,10'

$request                         = New-Object system.Windows.Forms.ComboBox
$request.width                   = 267
$request.height                  = 20
@('Maintenance','Technology') | ForEach-Object {[void] $request.Items.Add($_)}
$request.location                = New-Object System.Drawing.Point(122,113)
$request.Font                    = 'Microsoft Sans Serif,10'

$btn1                            = New-Object system.Windows.Forms.Button
$btn1.text                       = "Send Request"
$btn1.width                      = 98
$btn1.height                     = 40
$btn1.location                   = New-Object System.Drawing.Point(450,323)
$btn1.Font                       = 'Microsoft Sans Serif,10'

$btn2                            = New-Object system.Windows.Forms.Button
$btn2.text                       = "View My Tickets"
$btn2.width                      = 98
$btn2.height                     = 40
$btn2.location                   = New-Object System.Drawing.Point(450,200)
$btn2.Font                       = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($Label1,$Label2,$Label3,$Label4,$TextBox1,$email,$subject,$description,$request,$btn1,$btn2))
$Form.Controls.add($picturebox)

#region gui events {
$btn1.Add_Click({ sendRequest; thankyou })
$btn2.Add_Click({ opentickets })
#endregion events }

#endregion GUI }

function sendRequest()
{
# API Key
$FDApiKey="key"
#################################################

# Force TLS1.2 as Powershell defaults to TLS 1.0 and Freshdesk will fail connections 
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12

# Prep
$pair = "$($FDApiKey):$($FDApiKey)"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$FDHeaders = @{ Authorization = $basicAuthValue }
##################################################

$Body = @{
description = $description.Text
email = $email.Text
subject = $subject.Text
type = $request.Text
priority = 1
status = 2
}

Invoke-WebRequest "https://clasd.freshdesk.com/api/v2/tickets/" -Headers $FDHeaders  -ContentType "application/json" -Method Post -Body ($Body | ConvertTo-JSON)


}

function thankyou ()
{
New-BurntToastNotification -Text 'Request Sent' -AppLogo 'Y:\JustLion.jpg'
$description.Text = ''
$email.Text = ''
$subject.Text = ''
$request.Text = ''
}

<#function opentickets()
{
# API Key
$FDApiKey="key"
#################################################

# Force TLS1.2 as Powershell defaults to TLS 1.0 and Freshdesk will fail connections 
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12

# Prep
$pair = "$($FDApiKey):$($FDApiKey)"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$FDHeaders = @{ Authorization = $basicAuthValue }
##################################################

$requester = $email.Text
}

Invoke-RestMethod "https://clasd.freshdesk.com/api/v2/tickets?email='$requester'" -Headers $FDHeaders  -ContentType "application/json" -Method Get 
#>
function validate(){
    if($request.SelectedIndex -ge 1){
        $subject.Enabled = $true
    }
    else{
        $subject.Enabled = $false
    }
}

#Write your logic code here


[void]$Form.ShowDialog()

1 ответ

Решение

Во-первых, похоже, что вы никогда не присоединяли функцию Validate к какому-либо событию в поле со списком. Так, например, вы можете использовать событие TextChanged или SelectedIndexChanged в поле со списком.

Вы бы прикрепили это так:

$request.add_TextChanged({Validate})

или же

$request.add_SelectedIndexChanged({Validate})

Затем в вашем методе Validate вы можете проверить индекс следующим образом:

function Validate{
    if($request.SelectedIndex -ne -1){
        $subject.Enabled = $true
    }
    else{
        $subject.Enabled = $false
    }
}

Отрицательный 1 - это значение, когда индекс не выбран. Если вы предпочитаете, вы можете проверить длину текста. Это зависит от того, введет ли пользователь этот комбо или просто выберет уже существующие элементы из списка. Как уже было отмечено в комментариях, вы хотите отключить текстовое поле с самого начала, используя

$request.Enabled = $false

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

function Validate{
    if($request.SelectedIndex -ne -1){
        $subject.enabled = $true
    }
    else{
        $subject.Enabled = $false
    }
}

$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '600,400'
$Form.text = "Ticket Request Form"

$request = New-Object system.Windows.Forms.ComboBox
$request.width = 267
$request.height = 20
$request.location = New-Object System.Drawing.Point(122,113)
$request.Font = 'Microsoft Sans Serif,10'
$request.Items.Add('1')
$request.Items.Add('2')
$request.add_TextChanged({Validate})


$subject = New-Object system.Windows.Forms.TextBox
$subject.multiline = $false
$subject.width = 267
$subject.height = 20
$subject.location = New-Object System.Drawing.Point(122,147)
$subject.Font = 'Microsoft Sans Serif,10'
$subject.Enabled = $false

$Form.Controls.Add($request)
$Form.Controls.Add($subject)

$form.ShowDialog()
Другие вопросы по тегам