我有一个充满行的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
之后,其他所有内容都可以正常运行。我不知道如何终止删除事件。
有什么建议吗?
答案 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
,您就可以开始使用了。