Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DataGridView外部单击时隐藏表单_C#_Forms_Events_Visibility - Fatal编程技术网

C# 在DataGridView外部单击时隐藏表单

C# 在DataGridView外部单击时隐藏表单,c#,forms,events,visibility,C#,Forms,Events,Visibility,我有一个保存DataGridView的表单,这个表单还加载了一个只保存另一个DataGridView的不可见表单。第二个DGV用于显示第一个DGV中项目的更多信息 仅当用户在第一个DGV中任何行的第7个单元格内单击时,才应显示第二个DGV。我已经设法在单击其他单元格时将其隐藏,但在DataGridView外部单击时似乎无法将其隐藏。我已经尝试过Leave、RowLeave和LostFocus活动,但没有成功。我认为这是因为一旦显示第二个DataGridView,它就会获得焦点,而这会以某种方式扰

我有一个保存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;
}