如果在确认消息框中按“否”,如何在Powershell中停止事件

时间:2018-07-05 12:51:43

标签: powershell datagridview

我有一个充满行的DataGridView,可以使用Delete键选择和删除行。 按下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 :(得分:3)

在MSDN示例中,我们看到它们在c#中通过将e设置为对当前事件的引用,然后将e.Cancel设置为true来实现,这允许我们to cancel the event as covered here.语法如下:

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引用事件本身(并且有很多这样的事件,look at all of them仅用于DataGridView!),您将使用$_$PSItem。因此,在来自MSDN的那些示例中,如果看到它们使用e或类似名称引用当前事件,只需替换$_$PSItem,您就可以开始使用了。