C# 从datagrid视图当前选定单元格的正下方打开一个弹出窗口

C# 从datagrid视图当前选定单元格的正下方打开一个弹出窗口,c#,winforms,visual-studio-2010,C#,Winforms,Visual Studio 2010,我有一个带有一些数据的datagridview。我添加了一个自定义按钮,当我点击一个单元格时会显示出来。单击此按钮将打开一个弹出表单。我的要求是只设置弹出窗体的位置,它应该显示在datagridview的选定单元格的正下方。以下是屏幕截图: 这并不是100%有效,但根据我的评论,这是一个起点: 主要形式: public Form1() { InitializeComponent(); } private Point _cellClick;

我有一个带有一些数据的datagridview。我添加了一个自定义按钮,当我点击一个单元格时会显示出来。单击此按钮将打开一个弹出表单。我的要求是只设置弹出窗体的位置,它应该显示在datagridview的选定单元格的正下方。以下是屏幕截图:


这并不是100%有效,但根据我的评论,这是一个起点:

主要形式:

    public Form1()
    {
        InitializeComponent();
    }

    private Point _cellClick;
    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        var h = dataGridView1.Rows[0].Height;

        if (MousePosition.Y % h == 0)
        {
            _cellClick = new Point(MousePosition.X, MousePosition.Y);
        }
        else
        {
            var y = MousePosition.Y;

            do
            {
                y++;
            } while (y % h != 0);

            _cellClick = new Point(MousePosition.X, y);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var f = new Form2(_cellClick);
        f.ShowDialog(this);
    }
子表单:

    private Point loc;
    public Form2(Point location)
    {
        InitializeComponent();
        loc = location;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.SetDesktopLocation(loc.X, loc.Y);
    }
编辑这与您要查找的内容非常接近,唯一的问题是子窗体不会显示在单元格的“相邻”位置,而是显示鼠标单击单元格时的确切位置

您可能需要做一些基本的运算来计算单元格的高度以偏移MousePosition.Y,这样子窗体就会显示在它旁边。我认为您只需要将坐标四舍五入到N的最近倍数,其中N是
dataGridView1.Rows[0]。Height
,四舍五入


编辑2我刚刚编辑了代码以尝试类似的操作,现在子窗体往往显示在行的下面一点。

您是否已经有一些弹出控件?如果是这样的话,您应该显示它的一些方法或属性。您应该能够计算单元格的位置(不要忘记在该位置包含表单的其余部分),然后设置子表单的构造函数以
点作为参数,并使用该参数设置其位置。只需添加一条评论,让您知道我对答案进行了大量编辑,现在它非常接近您想要的内容。@KingKing是的,我有弹出控件。实际上,它只是一个winform,上面包含datagrid视图控件,没有其他内容。您好@sab669非常感谢您的帮助。我使用了你上面定义的代码,并且得到了我想要的输出。感谢您的帮助。此代码不是很好。当第一行的高度足够大(比如说大约100甚至200)并且表单位置在某个点时,弹出窗口的位置可能离实际的点击点很远。@KingKing Yea,我只在一个非常小的应用程序上做了一些基本的测试,但它工作得非常紧密,这是改进的起点。如果你有更好的解决办法,我想看看。我想更好的方法是将单元格坐标转换到屏幕位置,然后在那里启动表单,而不是我是如何完成的。。。但是我不知道怎么做。@sab669通过使用方法
DataGridView.GetCellDisplayRectangle(…)
和使用方法
PointToScreen
转换为屏幕坐标,代码可以更简单、更准确。您可以将弹出窗口定位在单击单元格的准确底线处。@KingKing啊,我曾尝试过摆弄矩形并使用左下角来获取位置,但我不知道用
指向屏幕
来翻译它,所以结果很差。