C# 在DataGridView外部单击时隐藏表单
我有一个保存DataGridView的表单,这个表单还加载了一个只保存另一个DataGridView的不可见表单。第二个DGV用于显示第一个DGV中项目的更多信息 仅当用户在第一个DGV中任何行的第7个单元格内单击时,才应显示第二个DGV。我已经设法在单击其他单元格时将其隐藏,但在DataGridView外部单击时似乎无法将其隐藏。我已经尝试过Leave、RowLeave和LostFocus活动,但没有成功。我认为这是因为一旦显示第二个DataGridView,它就会获得焦点,而这会以某种方式扰乱事件 这是我的密码:C# 在DataGridView外部单击时隐藏表单,c#,forms,events,visibility,C#,Forms,Events,Visibility,我有一个保存DataGridView的表单,这个表单还加载了一个只保存另一个DataGridView的不可见表单。第二个DGV用于显示第一个DGV中项目的更多信息 仅当用户在第一个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;
}
}
用户倾向于点击他们看到的最大窗口来关闭弹出窗口。您也可以对次窗体执行相同的操作;甚至可以在其上添加一个关闭按钮。我认为您应该将表单单击和网格离开事件结合起来,使其工作
private void Form1_Click(object sender, EventArgs e)
{
detailForm.Visible = false;
}
private void dataGridView1_Leave(object sender, EventArgs e)
{
detailForm.Visible = false;
}
现在,如果用户在表单上的网格外单击或直接单击其他控件,则应该隐藏您的详细信息表单
希望能有所帮助。这会起作用,但只有一个小问题:假设我的主网格的固定大小为800x600。根据数据行的数量,datagridview控件内可能有一个空白。当我点击这个空白区域时,网格并没有消失。我并不是说这是一个全面适用的解决方案。如果你想解释屏幕上的每一个像素,你就必须依赖很多不同的事件;尽管最终的程序可能变得相当不可靠。有了这些问题,与其把自己放在最糟糕的情况下,不如把自己放在最舒适/用户友好的情况下:用户希望直观地完成所有事情,在设计界面时考虑到这一点。谢谢你的评论让我想到了一个点子。我没有将整个网格的大小调整为formsize,而是将其设置为autosize,并将其放入一个面板中,然后将面板的大小调整为formsize。通过Panel_Click事件,我现在可以隐藏第二个表单。很高兴它达到了您的目的。但是,如果在获得弹出网格后,我单击了另一个控件(如文本框),该怎么办?我认为这可能不会使窗体隐形。我说的对吗?正如所说的:你越想做自动结账部分,你就必须考虑更多的事件。我个人更喜欢依靠“活动事件”(例如,点击或按键),而不是像离开这样的事件;但我想这是个人的选择。我认为你提出的情况不会发生在LeonidasFett案中;无论如何,我对这个问题的解决方案是:将自动关闭与主窗体中包含的每个对象(例如:文本框)的单击事件相关联;这种配置应该足够可靠。
private void Form1_Click(object sender, EventArgs e)
{
detailForm.Visible = false;
}
private void dataGridView1_Leave(object sender, EventArgs e)
{
detailForm.Visible = false;
}