После загрузки формы, проверьте элементы в списке и обратный отсчет - PullRequest
0 голосов
/ 19 мая 2019

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

  1. Я надеюсь, что при загрузке формы, на tabpage1, элемент списка, item1 и item3выбраны.На tabpage2, элемент списка, item4 выбран

  2. Добавить функцию автоматического подтверждения обратного отсчета. Если в течение 10 секунд после открытия формы не будет выполнено никаких действий, автоматически будет нажата кнопка OK.Если есть какая-либо операция, отмените обратный отсчет

Пожалуйста, смотрите изображение

pic


#----------------------------------------------
#region Application Functions
#----------------------------------------------

#endregion Application Functions

#----------------------------------------------
# Generated Form Function
#----------------------------------------------
function Show-form_psf {

    #----------------------------------------------
    #region Import the Assemblies
    #----------------------------------------------
    [void][reflection.assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
    [void][reflection.assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    #endregion Import Assemblies

    #----------------------------------------------
    #region Generated Form Objects
    #----------------------------------------------
    [System.Windows.Forms.Application]::EnableVisualStyles()
    $form1 = New-Object 'System.Windows.Forms.Form'
    $tabcontrol1 = New-Object 'System.Windows.Forms.TabControl'
    $tabpage1 = New-Object 'System.Windows.Forms.TabPage'
    $checkedlistbox1 = New-Object 'System.Windows.Forms.CheckedListBox'
    $tabpage2 = New-Object 'System.Windows.Forms.TabPage'
    $checkedlistbox2 = New-Object 'System.Windows.Forms.CheckedListBox'
    $buttonOK = New-Object 'System.Windows.Forms.Button'
    $InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
    #endregion Generated Form Objects

    #----------------------------------------------
    # User Generated Script
    #----------------------------------------------

    $form1_Load={
        #TODO: Initialize Form Controls here

    }

    #region Control Helper Functions
    function Update-ListBox
    {
    <#
        .SYNOPSIS
            This functions helps you load items into a ListBox or CheckedListBox.

        .DESCRIPTION
            Use this function to dynamically load items into the ListBox control.

        .PARAMETER ListBox
            The ListBox control you want to add items to.

        .PARAMETER Items
            The object or objects you wish to load into the ListBox's Items collection.

        .PARAMETER DisplayMember
            Indicates the property to display for the items in this control.

        .PARAMETER Append
            Adds the item(s) to the ListBox without clearing the Items collection.

        .EXAMPLE
            Update-ListBox $ListBox1 "Red", "White", "Blue"

        .EXAMPLE
            Update-ListBox $listBox1 "Red" -Append
            Update-ListBox $listBox1 "White" -Append
            Update-ListBox $listBox1 "Blue" -Append

        .EXAMPLE
            Update-ListBox $listBox1 (Get-Process) "ProcessName"

        .NOTES
            Additional information about the function.
    #>

        param
        (
            [Parameter(Mandatory = $true)]
            [ValidateNotNull()]
            [System.Windows.Forms.ListBox]
            $ListBox,
            [Parameter(Mandatory = $true)]
            [ValidateNotNull()]
            $Items,
            [Parameter(Mandatory = $false)]
            [string]
            $DisplayMember,
            [switch]
            $Append
        )

        if (-not $Append)
        {
            $listBox.Items.Clear()
        }

        if ($Items -is [System.Windows.Forms.ListBox+ObjectCollection])
        {
            $listBox.Items.AddRange($Items)
        }
        elseif ($Items -is [Array])
        {
            $listBox.BeginUpdate()
            foreach ($obj in $Items)
            {
                $listBox.Items.Add($obj)
            }
            $listBox.EndUpdate()
        }
        else
        {
            $listBox.Items.Add($Items)
        }

        $listBox.DisplayMember = $DisplayMember
    }
    #endregion

    $buttonOK_Click={
        #TODO: Place custom script here
        $checkedlistbox1.CheckedItems | Out-Host
        $checkedlistbox2.CheckedItems | Out-Host
    }


    # --End User Generated Script--
    #----------------------------------------------
    #region Generated Events
    #----------------------------------------------

    $Form_StateCorrection_Load=
    {
        #Correct the initial state of the form to prevent the .Net maximized form issue
        $form1.WindowState = $InitialFormWindowState
    }

    $Form_Cleanup_FormClosed=
    {
        #Remove all event handlers from the controls
        try
        {
            $buttonOK.remove_Click($buttonOK_Click)
            $form1.remove_Load($form1_Load)
            $form1.remove_Load($Form_StateCorrection_Load)
            $form1.remove_FormClosed($Form_Cleanup_FormClosed)
        }
        catch { Out-Null <# Prevent PSScriptAnalyzer warning #> }
    }
    #endregion Generated Events

    #----------------------------------------------
    #region Generated Form Code
    #----------------------------------------------
    $form1.SuspendLayout()
    $tabcontrol1.SuspendLayout()
    $tabpage1.SuspendLayout()
    $tabpage2.SuspendLayout()
    #
    # form1
    #
    $form1.Controls.Add($tabcontrol1)
    $form1.Controls.Add($buttonOK)
    $form1.AcceptButton = $buttonOK
    $form1.AutoScaleDimensions = '6, 13'
    $form1.AutoScaleMode = 'Font'
    $form1.ClientSize = '284, 262'
    $form1.FormBorderStyle = 'FixedDialog'
    $form1.MaximizeBox = $False
    $form1.MinimizeBox = $False
    $form1.Name = 'form1'
    $form1.StartPosition = 'CenterScreen'
    $form1.Text = 'Form'
    $form1.add_Load($form1_Load)
    #
    # tabcontrol1
    #
    $tabcontrol1.Controls.Add($tabpage1)
    $tabcontrol1.Controls.Add($tabpage2)
    $tabcontrol1.Location = '22, 17'
    $tabcontrol1.Name = 'tabcontrol1'
    $tabcontrol1.SelectedIndex = 0
    $tabcontrol1.Size = '240, 204'
    $tabcontrol1.TabIndex = 1
    #
    # tabpage1
    #
    $tabpage1.Controls.Add($checkedlistbox1)
    $tabpage1.Location = '4, 22'
    $tabpage1.Name = 'tabpage1'
    $tabpage1.Padding = '3, 3, 3, 3'
    $tabpage1.Size = '232, 178'
    $tabpage1.TabIndex = 0
    $tabpage1.Text = 'tabpage1'
    $tabpage1.UseVisualStyleBackColor = $True
    #
    # checkedlistbox1
    #
    $checkedlistbox1.CheckOnClick = $True
    $checkedlistbox1.FormattingEnabled = $True
    [void]$checkedlistbox1.Items.Add('item 1')
    [void]$checkedlistbox1.Items.Add('item 2')
    [void]$checkedlistbox1.Items.Add('item 3')
    $checkedlistbox1.Location = '26, 27'
    $checkedlistbox1.Name = 'checkedlistbox1'
    $checkedlistbox1.Size = '181, 124'
    $checkedlistbox1.TabIndex = 0
    $checkedlistbox1.UseCompatibleTextRendering = $True
    #
    # tabpage2
    #
    $tabpage2.Controls.Add($checkedlistbox2)
    $tabpage2.Location = '4, 22'
    $tabpage2.Name = 'tabpage2'
    $tabpage2.Padding = '3, 3, 3, 3'
    $tabpage2.Size = '232, 178'
    $tabpage2.TabIndex = 1
    $tabpage2.Text = 'tabpage2'
    $tabpage2.UseVisualStyleBackColor = $True
    #
    # checkedlistbox2
    #
    $checkedlistbox2.CheckOnClick = $True
    $checkedlistbox2.FormattingEnabled = $True
    [void]$checkedlistbox2.Items.Add('item 4')
    [void]$checkedlistbox2.Items.Add('item 5')
    [void]$checkedlistbox2.Items.Add('item 6')
    $checkedlistbox2.Location = '26, 27'
    $checkedlistbox2.Name = 'checkedlistbox2'
    $checkedlistbox2.Size = '181, 124'
    $checkedlistbox2.TabIndex = 1
    $checkedlistbox2.UseCompatibleTextRendering = $True
    #
    # buttonOK
    #
    $buttonOK.Anchor = 'Bottom, Right'
    $buttonOK.DialogResult = 'OK'
    $buttonOK.Location = '197, 227'
    $buttonOK.Name = 'buttonOK'
    $buttonOK.Size = '75, 23'
    $buttonOK.TabIndex = 0
    $buttonOK.Text = '&OK'
    $buttonOK.UseCompatibleTextRendering = $True
    $buttonOK.UseVisualStyleBackColor = $True
    $buttonOK.add_Click($buttonOK_Click)
    $tabpage2.ResumeLayout()
    $tabpage1.ResumeLayout()
    $tabcontrol1.ResumeLayout()
    $form1.ResumeLayout()
    #endregion Generated Form Code

    #----------------------------------------------

    #Save the initial state of the form
    $InitialFormWindowState = $form1.WindowState
    #Init the OnLoad event to correct the initial state of the form
    $form1.add_Load($Form_StateCorrection_Load)
    #Clean up the control events
    $form1.add_FormClosed($Form_Cleanup_FormClosed)
    #Show the Form
    return $form1.ShowDialog()

} #End Function

#Call the form
Show-form_psf | Out-Null

1 Ответ

0 голосов
/ 19 мая 2019

В части $form1_Load={} вы можете циклически перемещаться по элементам tabpage и иметь свойство checked нужного элемента в $true.Вы можете добавить sleep for 1s в цикл for для 10, отсчитывая время и отображая значение в форме в виде метки или чего-то еще.Не забудьте добавить прерывание [System.Windows.Forms.Application]::DoEvents() после команды sleep внутри цикла for.

Теперь в обработчике событий OnCLick каждого элемента можно добавить код для установки глобального флага, скажем $global:OperationFlag=$true, которыйможно проверить из цикла do-while, например:

#lets say you set this somewhere early
$Global:OperationFlag = $false

$i = 10
do
{
    for ($c = 10; $c -gt 0; $c--)
    {
        Start-Sleep -Milliseconds 100
        [System.Windows.Forms.Application]::DoEvents()
        #This will simulate a 1 second sleep while waiting on interrupts from other operations
    }

    $labelCountdown.Text = $i #Where $labelCountdown is the label that is used on your display to show the countdown.
    #Change this depending on the name you are using.

    $i--
    if ($i -eq 0)
    {
        #hit OK
        $buttonOK.Click()
    }
    if ($Global:OperationFlag -eq $true)
    {
        Return
    }
}
While ($i -gt 0)

и вернуться из цикла обратного отсчета при регистрации события щелчка.Или используйте одно из других событий, которые квалифицируются как операция в вашем случае, например valuechanged или что-то еще.Я не могу вспомнить.Цикл Do-While также будет работать вместо цикла for.

Если событие не зарегистрировано, вы можете вызвать функцию click кнопки OK, когда обратный отсчет достигнет нуля.

Я знаю, это не лучший или единственный способ, но это начало.

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