我有一个包含DataGridView的窗体,此窗体还会加载一个不可见的窗体,该窗体只保存另一个DataGridView。第二个DGV用于显示有关第一个DGV中项目的更多信息。在DataGridView之外单击时隐藏窗体
仅当用户在第一个DGV中的任何行的第7个单元格内单击时才应显示第二个DGV。当我单击其他单元格时,我已经设法隐藏它,但当我单击DataGridView外部时,似乎无法隐藏它。我已经尝试了Leave,RowLeave和LostFocus事件,但都没有成功。我认为这是因为一旦显示第二个DataGridView,它就会获得焦点,并且这会随着事件而变得混乱。
这里是我的代码:
public class Form1
{
Form schedules = new Form();
DataGridView backups = new DataGridView();
public Form1()
{
this.schedules.Visible = false;
backups.DataBind();
}
private void backups_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1 && e.ColumnIndex == 7)
{
if (this.schedules.getData(Convert.ToInt32(backups.Rows[e.RowIndex].Cells[0].Value)))
{
this.schedules.Owner = this;
this.schedules.Visible = true;
this.schedules.changePosition(Cursor.Position);
}
else
{
this.schedules.Visible = false;
}
}
else
{
this.schedules.Visible = false;
}
}
}
public class Schedules : Form
{
DataGridView grdSchedules = new DataGridView();
public Schedules()
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Visible = false;
this.AutoSize = true;
this.grdSchedules.RowHeadersVisible = false;
this.grdSchedules.AllowUserToAddRows = false;
this.grdSchedules.ScrollBars = ScrollBars.None;
this.grdSchedules.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
this.grdSchedules.AllowUserToResizeColumns = false;
this.grdSchedules.AllowUserToResizeRows = false;
this.grdSchedules.AllowUserToDeleteRows = false;
}
}
这会工作,但只有一个小问题:比方说,我的主网格具有800x600的固定大小。取决于数据行的数量,datagridview控件内可能有空的空间。当我点击这个空白区域时,网格不会消失 – LeonidasFett
我并不是说这是一个全面适用的解决方案。如果你想考虑屏幕上的每一个像素,你将不得不依赖许多不同的事件;尽管由此产生的程序可能变得相当不可靠。有了这些问题,不要将自己置于最糟糕的情况下,只需将自己置于最舒适/用户友好的情况下:用户希望直观地完成所有事情,并根据这一事实设计界面。 – varocarbas
感谢您的评论给我带来了一个想法。我没有将整个网格大小设置为表单大小,而是将其设置为自动大小,并将其放入一个面板中,然后依次将其大小设置为表单大小。通过Panel_Click事件,我现在可以隐藏第二个表单。 – LeonidasFett