Как остановить событие в powershell, если в окне сообщения с подтверждением нажата Нет - PullRequest
0 голосов
/ 05 июля 2018

У меня есть DataGridView, заполненный строками с возможностью выбирать и удалять строки, используя клавишу Delete. При нажатии «Удалить» появляется окно с сообщением о подтверждении, запрашивающее Да или Нет, чтобы продолжить удаление.

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

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '800,800'
$Form.text                       = "Form"
$Form.TopMost                    = $false

$DataGridView1                   = New-Object system.Windows.Forms.DataGridView
$DataGridView1.BackColor         = "#f7f7f7"
$DataGridView1.width             = 771
$DataGridView1.height            = 716
$DataGridView1.Anchor            = 'top,right,bottom,left'
$DataGridView1.location          = New-Object System.Drawing.Point(15,68)

$import                          = New-Object system.Windows.Forms.Button
$import.text                     = "import"
$import.width                    = 60
$import.height                   = 30
$import.location                 = New-Object System.Drawing.Point(25,22)
$import.Font                     = 'Microsoft Sans Serif,10'

$save                            = New-Object system.Windows.Forms.Button
$save.text                       = "save"
$save.width                      = 60
$save.height                     = 30
$save.location                   = New-Object System.Drawing.Point(125,22)
$save.Font                       = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($DataGridView1,$import,$save))


$import.Add_Click({ importXML })
$save.Add_Click({ saveXML })
$DataGridView1.Add_UserDeletingRow({ message })

$DataGridView1.AutoSizeColumnsMode = 16
Function importXML(){
    $xml_input = Get-FileName
    $ds = New-Object System.Data.Dataset
    $ds.ReadXml($xml_input)
    $DataGridView1.DataSource = $ds.Tables[0]
}
Function message(){
    $msgBoxInput = [System.Windows.Forms.MessageBox]::Show("Proceed with the deletion?","Delete confirmation","YesNo","Question")
        if ($msgBoxInput -eq "YES" ) 
        {
            [System.Windows.Forms.MessageBox]::Show("The selected row will be deleted")
        }
        else
        {
            #stop the deletion
        }
}
Function saveXML(){
    $xml_output = Save-FileName
    $DataGridView1.DataSource.writexml($xml_output)
}

[void]$Form.ShowDialog()

Все работает отлично, кроме как после else. Я понятия не имею, как прервать событие удаления.

Есть предложения?

1 Ответ

0 голосов
/ 05 июля 2018

В примерах MSDN мы видим, что они делают это в c #, устанавливая e как ссылку на текущее событие, а затем устанавливая e.Cancel равным true, что позволяет нам отменить событие, как описано. здесь. Синтаксис выглядит следующим образом:

private void DataGridView1_UserDeletingRow(object sender,
DataGridViewRowCancelEventArgs e){
  e.Cancel = true; //Cancel the event
}

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

Оказывается, к счастью, обманчиво легко ссылаться на текущее событие! Чтобы отменить удаление, просто добавьте это в свой add_UserDeletingRow() скрипт-блок.

else
        {
            #stop the deletion
            $PSItem.Cancel=$true
        }

Вы также можете использовать синтаксис текущего элемента $_, который будет выглядеть как

else
        {
            #stop the deletion
            $_.Cancel=$true
        }

Каждый раз, когда вы добавляете обработчик события и вам нужно обратиться к самому событию с помощью PowerShell (и таких событий много, посмотрите на все из них только для DataGridView!) вы будете использовать $_ или $PSItem. Так что в тех примерах из MSDN, если вы видите, что они ссылаются на текущее событие с e или чем-то подобным, просто замените $_ или $PSItem, и вы будете в порядке.

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