【问题标题】:Hide Form when clicked outside of DataGridView在 DataGridView 外部单击时隐藏表单
【发布时间】:2013-07-01 11:12:33
【问题描述】:

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

【问题讨论】:

    标签: c# forms events visibility


    【解决方案1】:
    private void Form1_Click(object sender, EventArgs e)
    {
        this.schedules.Visible = false;
    }
    

    用户倾向于点击他们看到的最大窗口来关闭弹出窗口。您也可以对辅助表单执行相同的操作;甚至添加一个关闭按钮。

    【讨论】:

    • 这可行,但只有一个小问题:假设我的主网格有一个固定大小为 800x600。根据数据行的数量,datagridview 控件内可能有一个空白区域。当我点击这个空白区域时,网格不会消失
    • 我并不是说这是一个全面适用的解决方案。如果您想考虑屏幕中的每个像素,您将不得不依赖许多不同的事件;尽管生成的程序可能变得非常不可靠。面对这类问题,与其把自己置于最坏的境地,不如把自己置于最舒适/对用户最友好的境地:用户希望直观地完成所有事情,在设计界面时要牢记这一点。
    • 感谢您的评论让我想到了一个想法。我没有将整个网格的大小调整为 formsize,而是将其设置为自动调整大小并将其放入一个面板中,然后我将其调整为 formsize。通过 Panel_Click 事件,我现在可以隐藏第二个表单。
    • 很高兴它达到了您的目的。但是,如果在获得弹出网格之后,我点击了一个不同的控件,比如一个文本框呢?我认为这可能不会使表单不可见。我说的对吗?
    • 如前所述:您想要制作自动关闭部分的整体会计越多,您必须考虑的事件就越多。我个人更喜欢依赖“活动事件”(例如 Click 或 KeyDown)而不是 Leave 等事件;但我想这是个人选择。我认为你提出的情况不会发生在 LeonidasFett 案中;无论如何,我对这个问题的解决方案是:将自动关闭与主窗体中包含的每个单个对象的 Click 事件相关联(例如:文本框);这个配置应该足够可靠。
    【解决方案2】:

    我想你会想要结合表单点击和网格离开事件来使它工作。

    private void Form1_Click(object sender, EventArgs e)
    {
        detailForm.Visible = false;
    }
    
    private void dataGridView1_Leave(object sender, EventArgs e)
    {
        detailForm.Visible = false;
    }
    

    现在,如果用户在表单上的 Grid 外部单击或直接点击其他控件,那么您的详细表单应该被隐藏。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 2011-09-20
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多