我正在尝试为datagridview创建一个上下文菜单。我从这里尝试过几个样本,但是无法理解为什么下面的任何行总是返回-1。这是一个winforms,网格从数据表中填充。我在这里做错了什么?
DataGridView.HitTestInfo hit = dgvResults.HitTest(e.X, e.Y);
我的代码:
private void dgvResults_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex >= 0 && e.RowIndex >= 0 && e.Button == MouseButtons.Right)
{
DataGridView.HitTestInfo hit = dgvResults.HitTest(e.X, e.Y); \\ this shows as -1 always
if (hit.Type == DataGridViewHitTestType.Cell)
{
dgvResults.CurrentCell = dgvResults[hit.ColumnIndex, hit.RowIndex];
cmsResults.Show(dgvResults, e.X, e.Y);
}
}
}
当我使用MouseClick事件时,它似乎有效,我有点迷失在这里
private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
cmsResults.Show(dgvResults, new Point(e.X, e.Y));
}
}
编辑:
我终于使用了以下代码。
感谢所有人
对我有用的代码:
private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
dgvResults.ClearSelection();
if (currentMouseOverRow >= 0) // will show Context Menu Strip if not negative
{
dgvResults.Rows[currentMouseOverRow].Selected = true;
cmsResults.Show(dgvResults, new Point(e.X, e.Y));
row = currentMouseOverRow;
}
}
}
答案 0 :(得分:2)
这是正常行为,因为EventArgs返回的X和Y坐标相对于托管控件的左上角:
MouseEventArgs
返回相对于DataGridView
控件的X / Y坐标。DataGridViewCellMouseEventArgs
返回相对于DataGridViewCell
控件的X / Y坐标。 HitTest
针对DataGridView
控件执行,只是将提供的X / Y转换为列/行索引而不做任何修改。
下面的插图演示了这个想法(使用Blue - 由MouseEventArgs
返回的值,使用Green - DataGridViewCellMouseEventArgs)
答案 1 :(得分:0)
看看 -
http://bytes.com/topic/c-sharp/answers/826824-invalid-coordinates-datagridview-hittest
特别是 -
Point p = dataGridView2.PointToClient(new Point(e.X, e.Y);
DataGridView.HitTestInfo info = dataGridView2.HitTest(p.X, p.Y);
int row = info.RowIndex;
答案 2 :(得分:0)
我终于使用了以下代码。
private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
dgvResults.ClearSelection();
if (currentMouseOverRow >= 0) // will show Context Menu Strip if not negative
{
dgvResults.Rows[currentMouseOverRow].Selected = true;
cmsResults.Show(dgvResults, new Point(e.X, e.Y));
row = currentMouseOverRow;
}
}
}