如何从DragDrop事件中选择一个datagridview行或单元格?

4
void dataGridView1_DragDrop(object sender, DragEventArgs e)
    {
        object data = e.Data.GetData(typeof(string));

        MessageBox.Show(e.X + " " + e.Y + " " + dataGridView1.HitTest(e.X, e.Y).RowIndex.ToString());

        if (dataGridView1.HitTest(e.X, e.Y).Type == DataGridViewHitTestType.Cell)
        {
            MessageBox.Show("!");
        }

    }

如果我尝试使用上述测试代码将项目拖动到datagridview中,我可以正确地从data.ToString()获取数据,但我无法定位行或单元格。 RowIndex.ToString()返回"-1",我的if语句返回false,因此永远不会进入if代码块。
我的代码有什么问题?

我认为我们需要更多的信息。我可以猜测HitTest试图做什么,但我们能看到代码吗? - womp
你需要代码的哪些其他部分? - Dave
我只想让它返回拖放结束的行,这样我就可以在该行中填充从列表视图拖动的字符串。 - Dave
@womp:HitTest是.Net中的标准方法,其中控件根据位置返回对象信息,通常来自鼠标单击或拖放,例如此示例。请参见http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.hittest.aspx。 - cdkMoose
1个回答

15

我认为从DragAndDrop传递的是屏幕空间坐标。我认为你需要将这些点强制转换为客户端坐标空间。

Point dscreen = new Point(e.X, e.Y);
Point dclient = dataGridView1.PointToClient(dscreen );
DataGridView.HitTestInfo hitTest = dataGridView1.HitTest(dclient.X,dclient.Y);

那么hitTest.Row将具有行索引。


运行得很好!我会查一下我对PointToClient等所做的事情,谢谢。 - Dave
仍然可以在VB.net 2022中使用(转换后)。谢谢。hitTest.Row是hitTest.RowIndex。 - vr_driver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接