【问题标题】:Get the Row the user Right Clicked on in a Grid before they click on an item in the Context Menu在用户单击上下文菜单中的项目之前,获取用户在网格中右键单击的行
【发布时间】:2013-11-12 00:02:04
【问题描述】:

我有一个 DevExpress GridControl,它有一个 ContextMenuStrip,上面有 2 个项目。 我希望能够右键单击 GridControl 中的记录并启动用户的默认浏览器并使用他们的默认搜索引擎和 ContextMenu 中的一项来搜索术语。

我的代码:

    int rowX, rowY;

    private void genericView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            rowX = MousePosition.X;
            rowY = MousePosition.Y;
        }
    }

    private void tsmSearch_Click(object sender, EventArgs e)
    {
        int key = GetRowAt(gdcErrorLogDefaultView, rowX, rowY);

        if (key < 0)
            return;

        string ex = gdcErrorLogDefaultView.GetRowCellValue(key, "Exception").ToString();
        //Logic to launch browser & search for ex
    }

    public int GetRowAt(GridView view, int x, int y)
    {
        return view.CalcHitInfo(new Point(x, y)).RowHandle;
    }

我知道 GetRowAt 可以正确计算行,我在代码的其他地方将它用于许多其他目的。但是,它没有在我的 tsmSearch_Click 事件中正确获取密钥。

在测试时,我在 Click 事件中的 if 语句上设置了一个断点。 key = -2147483648。我希望为 0,因为在这个特定的测试中,我的网格中只有 1 行。

有没有不同的方法来实现这一点?网格支持多选,所以我不想在他们右击时以编程方式选择行来“覆盖”他们的选择。

这是我要描述的内容的屏幕截图:

【问题讨论】:

    标签: c# winforms .net-3.5 devexpress gridcontrol


    【解决方案1】:

    当然,当我最终决定发布这个问题时,我就意识到了我的问题。 MouseDown 事件应该如下:

    private void genericView_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            rowX = e.X;
            rowY = e.Y;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我希望为 0,因为在这个特定的测试中,我的网格中只有 1 行

      在这种情况下期望0 是不正确的。此外,-2147483648 是行句柄的有效值(此值表示无效的行句柄)。 有关行句柄的更多信息,请参阅Identifying Rows and Cards 帮助文章。

      我相信在您的情况下,最好通过ColumnView.GetSelectedRows 方法获取所选行的句柄。有关详细信息,请参阅Selections Overview 文档。

      相关例子:

      1. How to: Identify the Grid's Element Located Under the Mouse Cursor
      2. How to: Obtain and Modify Selected Rows

      【讨论】:

      • 感谢您的链接,但右键单击不会选择行,因此用户可能没有选择。因此我需要在鼠标位置获取行。而且由于行索引是基于 0 的,为什么期望 0 是错误的? 0 是第一个条目,只有 1 行。还有什么可能?
      • @sab669 行句柄不是从零开始的 - 例如,任何组行的行索引为负数,新项目行的行索引为 -2147483647(请参阅我的链接中的帮助文章)。无论如何,在您的情况下这不是问题,但一般来说可能是一个问题。正如鼠标光标示例中指定的那样,您应该使用基于客户端的坐标进行命中测试,例如e.Location 而不是基于屏幕的Control.MousePosition
      • 当然它们是从零开始的。并且 GetSelectedRows 直到鼠标按下事件触发后才会更新 - 在这种情况下为时已晚。
      • @Grantly 我的回答没有错,所以我不太清楚你为什么不投票。 数据行句柄仅从零开始,但一般来说,有句柄不是从零开始的组行、过滤行、详细信息行。此外,任何排序或过滤操作都可以更改从零开始的数据行顺序。
      • @DmitryG 您的回答提供了很多信息,但确实没有抓住重点,也没有关注问题。基于零的“通常”被理解为第一个元素由零索引。这就是 RowHandles 的工作方式,尽管还有更多的 -ve 值。因此,您混淆了第一点而不是提供了帮助。 OP 正确地假设如果第一行被聚焦,则在他的示例中 Handle 将为零。
      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多