我在DataGridView中有10列。
如果我点击第一个单元格,弹出窗口的起始位置应该靠近第一个单元格 如果我点击第二个单元格,弹出窗口的起始位置应该靠近第二个单元格 如果我点击第三个单元格,弹出窗口的起始位置应该靠近第三个单元格。
如何相应地更改RowIndex
和ColumnIndex
?
在Datagridview_CellClick
sub
mPopup.Show(datagridview.PointToScreen(New Point(e.RowIndex , e.ColumnIndex )))
end sub
答案 0 :(得分:0)
由于这是.NET,所有索引都从0开始。 e.RowIndex和e.ColumnIndex的值范围仅为0-2。 我想你的结果是你选择的点最终位于左上角。
您需要先计算实际单元格的位置,然后将该值应用于New Point方法。
这篇文章有一个很好的例子 Current Selected Cell Position
根据该帖子,您只需要致电
Dim rect as Rectangle = DataGridView.GetCellDisplayRectangle(e.RowIndex, e.ColumnIndex)
Dim left as int = rect.Left
Dim top as int = rect.Top
获取正确的Point值。 然后将其传递回
datagridview.PointToScreen(New Point(top,left))
请务必检查我的语法,自从我写VB以来已经有一段时间了。
答案 1 :(得分:0)
您需要将所有位置偏移相加以获得正确的点。
此代码显示单击的单元格右下角的上下文菜单:
Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
Dim rect As Rectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, False)
Dim formBorderWidth As Integer = CInt((Me.Width - Me.ClientSize.Width) / 2)
Dim formTitlebarHeight As Integer = Me.Height - Me.ClientSize.Height - 2 * formBorderWidth
Dim left As Integer = Me.Left + formBorderWidth + DataGridView1.Left + rect.Left + rect.Width
Dim top As Integer = Me.Top + formTitlebarHeight + formBorderWidth + DataGridView1.Top + rect.Top + rect.Height
Dim pt As New Point(left, top)
ContextMenuStrip1.Show(pt)
End Sub
我觉得可能有一种更简单的方法可以做到这一点,但现在可以使用。