智能对话框(表格)位置没有覆盖控制组件和屏幕内? (C#)

时间:2015-09-09 05:31:27

标签: c# forms dialog

我的表单中有一个DataGridView。当我单击此DataGridView中的单元格时,它将显示一个对话框。

Form_Para formPara = new Form_Para();
formPara.ShowDialog();

一般情况下,我希望此对话框只是在屏幕内并在此单元格下方。 如果在下面显示此单元格将不在屏幕上,则将其位置更改为单元格上方。

我知道我可以获得对话框的大小和位置以及屏幕范围来计算新的对话位置。但是,有更简单的方法吗?

例如,当我将'StartPosition'对话框设置为'CenterParent'时。 它将显示在父窗体的中心,并在屏幕内自动显示 。我不需要计算新的位置以避免屏幕外。

非常感谢。

1 个答案:

答案 0 :(得分:-1)

最后,我认为设置' StartPosition'对话框为' CenterParent'更简单。 然后只更改Location.Y以避免覆盖当前单元格。

Point currCellPosTop, currCellBottom;
currCellPosTop = dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, true).Location;
currCellPosTop = dataGridView1.PointToScreen(currCellPosTop);
currCellBottom = new Point(currCellPosTop.X, currCellPosTop.Y );
currCellBottom.Y += dataGridView1.CurrentCell.Size.Height;

Form_Para formPara = new Form_Para(currCellPosTop, currCellBottom);   
formPara.StartPosition = FormStartPosition.CenterParent;         
formPara.ShowDialog();

对话形式:

private Point _TriggerControlPosTop;
private Point _TriggerControlPosBottom;
public Form_Para(Point triggerControlPosTop, Point triggerControlPosBottom)
{
    _TriggerControlPosTop = triggerControlPosTop;
    _TriggerControlPosBottom = triggerControlPosBottom;
    InitializeComponent();            
}

对话框的可见更改事件:

private void Form_Para_VisibleChanged(object sender, EventArgs e)
{
    this.Location = new Point(this.Location.X, _TriggerControlPosBottom.Y);
    if (_TriggerControlPosBottom.Y + this.Height > Screen.PrimaryScreen.Bounds.Height)
    {
        this.Location = new Point(this.Location.X, _TriggerControlPosTop.Y - this.Height);
    } 
}