我已经在for
循环中动态创建了一些按钮,并尝试处理其MouseClick
事件,并在事件处理程序中,尝试在消息框中显示单击的控件的名称。 / p>
问题是:
当我单击一个按钮时,它总是显示最后一个控件的名称 消息框。
在C#中,我可以像处理button.MouseClick+= (sender, e) => {/*...*/};
那样处理它。但是在PowerShell中,如何正确处理PowerShell中Windows窗体控件的事件并使用Sender
和EventArgs
?
以下是重现该问题的代码:
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$flp = New-Object System.Windows.Forms.FlowLayoutPanel
$flp.AutoScroll = $true
$flp.Dock = [System.Windows.Forms.DockStyle]::Fill
$form.Controls.Add($flp)
for($i = 0; $i -lt 10; $i++){
$button = New-Object System.Windows.Forms.Button
$button.Name = "Button_$i"
$button.Text = "Button $i"
$button.Add_MouseClick({
[System.Windows.Forms.MessageBox]::Show("$($button.Name)")
})
$flp.Controls.Add($button)
}
$form.ShowDialog() | Out-Null
$form.Dispose()
答案 0 :(得分:3)
要在PowerShell中正确处理Windows窗体控件的事件并利用Sender
和EventArgs
,可以使用以下任一选项:
sender
和e
参数$this
和$_
变量 为脚本块定义sender
和e
参数
就像C#中的lambda事件处理程序一样,您可以为脚本块定义param($sender,$e)
:
$button.Add_MouseClick({param($sender,$e)
[System.Windows.Forms.MessageBox]::Show(" $($sender.Name) `n $($e.Location)")
})
使用$this
和$_
变量
$this
是事件的发送者,$_
是事件的参数:
$button.Add_MouseClick({
[System.Windows.Forms.MessageBox]::Show(" $($this.Name) `n $($_.Location)")
})