2013-07-01 28 views
0

我有一个包含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; 
    } 
} 

回答

1
private void Form1_Click(object sender, EventArgs e) 
{ 
    this.schedules.Visible = false; 
} 

用户倾向于点击他们看到关闭弹出窗口的最大窗口。你也可以对二级表格做同样的事情;或者甚至添加一个关闭按钮。

+0

这会工作,但只有一个小问题:比方说,我的主网格具有800x600的固定大小。取决于数据行的数量,datagridview控件内可能有空的空间。当我点击这个空白区域时,网格不会消失 – LeonidasFett

+1

我并不是说这是一个全面适用的解决方案。如果你想考虑屏幕上的每一个像素,你将不得不依赖许多不同的事件;尽管由此产生的程序可能变得相当不可靠。有了这些问题,不要将自己置于最糟糕的情况下,只需将自己置于最舒适/用户友好的情况下:用户希望直观地完成所有事情,并根据这一事实设计界面。 – varocarbas

+0

感谢您的评论给我带来了一个想法。我没有将整个网格大小设置为表单大小,而是将其设置为自动大小,并将其放入一个面板中,然后依次将其大小设置为表单大小。通过Panel_Click事件,我现在可以隐藏第二个表单。 – LeonidasFett

1

我想你会想结合表单单击和网格离开事件,使其工作。

​​

现在,如果用户在窗体上单击外部网格或直接在不同控件上单击,则应隐藏您的详细信息窗体。

希望它有帮助。