【问题标题】:Right Click to select a row in datagridview control in powershell右键单击在powershell中的datagridview控件中选择一行
【发布时间】:2021-08-19 20:06:27
【问题描述】:

我正在使用 WPF 控件在 Powershell 中开发一个项目。

我有一个数据网格视图,其中只能选择一整行。还有一个 contextmenustrip 在 datagridview 中也可以正常工作。

我的问题是我想要一个右键单击鼠标事件来选择单击它的行并显示上下文菜单条。所以用户点击了什么是毫无疑问的。目前,选中的行在右键单击时不会改变。

我找到了很多示例,但可以使用一些指导将它们转换为在 powershell 中使用。

一旦我把它记下来,我想为每个 contextmenustrip 选择分配操作 谢谢!

【问题讨论】:

  • “我找到了很多例子,但可以使用一些指导来将它们转换为在 powershell 中使用。” - 有哪些例子,你坚持哪些部分?
  • 例如,这是一个我发现没有针对在 powershell 中使用进行优化的示例(列出的第一个答案)stackoverflow.com/questions/3035144/…我只是不确定在哪里以及如何转换它。它是在我的 contextmenustrip 创建中,还是在我的 datagridviewproperties 中,或两者兼而有之?
  • @MathiasR.Jessen,所以此时我有办法确定它是否是右键单击,我想我有办法选择行,但我不确定如何获得填充我的 hittest 变量的屏幕坐标...$DataGridView.add_mouseup({ If ($_.Button -eq [System.Windows.Forms.MouseButtons]::Right){ $point $HTI = $DataGridView.HitTest(?) $DataGridView.ClearSelection() $DataGridView.Rows[$HTI.RowIndex].Selected = $true } })

标签: powershell datagridview wpf-controls


【解决方案1】:

linked answer 中的代码,可以像下面这样翻译成 PowerShell。

事件处理程序注册

this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click);

PowerShell 不支持将+= 用于事件处理程序注册,但您还有另外两个选择。要么调用 C# 最终将 += 转换为的特殊命名方法 - 它们都将具有 add_<EventName> 的形式:

$dataGridView = [System.Windows.Forms.DataGridView]::new()
# ...
$dataGridView.add_MouseDown($dgvMouseHandler)

或者,使用 Register-ObjectEvent cmdlet 让 PowerShell 为您处理注册:

Register-ObjectEvent $dataGridView -EventName MouseDown -Action $dgvMouseHandler

事件参数

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) {
    if(e.Button == MouseButtons.Right)
    {
        var hti = MyDataGridView.HitTest(e.X, e.Y);
        // ... 

为了使用事件处理程序参数,您可以在脚本块中声明由handler delegate 定义的参数:

$dgvMouseHandler = {
  param($sender,[System.Windows.Forms.MouseEventArgs]$e)

  # now you can dereference `$e.X` like in the C# example
}

或利用$EventArgs automatic variable

$dgvMouseHandler = {
  # `$EventArgs.X` will also do
}

【讨论】:

  • 感谢详细的解释!我仍然不清楚这一切发生在剧本的什么地方。参数是否在 if 语句中用于右键单击?这就是我得到的……#Add a DataGridView $DataGridView.add_MouseDown($dgvMouseHandler) If ($_.Button -eq [System.Windows.Forms.MouseButtons]::Right){ $dgvMouseHandler = { param($sender,[System.Windows.Forms.MouseEventArgs]$e) } $HTI = $DataGridView.HitTest($e.x,$e.y) $DataGridView.ClearSelection() $DataGridView.Rows[$HTI.RowIndex].Selected = $true } $main_form.Controls.Add($DataGridView)
  • @Jimbaland if 语句将进入 $dvgMouseHandler 块内,因此它是 if($e.Button -eq ...),假设您已将参数声明为 @987654339 @
  • 将 If 语句放置到鼠标处理程序块中是缺失的部分。现在按预期工作。一旦我获得足够的声望点,我会投票赞成 :)
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-09
相关资源
最近更新 更多