2013-07-01 9 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. в зависимости от количества datarows, внутри элемента управления datagridview может быть пустое пространство. когда я нажимаю это пустое место, сетка не исчезает – LeonidasFett

+1

Я не говорю, что это общее применимое решение. Если вы хотите учесть каждый отдельный пиксель на экране, вам придется полагаться на множество разных событий; хотя полученная программа может стать довольно ненадежной. При таких проблемах, а не в том, чтобы оказаться в худшем сценарии, просто поставьте себя в самый удобный/удобный случай: пользователи хотят, чтобы все было сделано интуитивно, дизайн вашего интерфейса с учетом этого факта. – varocarbas

+0

благодаря вашему комментарию привел меня к идее. вместо того, чтобы выровнять всю сетку до формы, я настроил ее на автоматизацию и поместил ее в панель, которую я, в свою очередь, сделал размером с formize. с событием Panel_Click, теперь я могу скрыть вторую форму. – LeonidasFett

1

Я думаю, что вы хотели бы объединить событие формы Click и Grid Leave, чтобы заставить его работать.

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

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

Теперь, если пользователь нажмет вне сетки на форме или непосредственно в другой элемент управления, то ваша форма детали должны быть скрыты.

Надеюсь, это поможет.

Смежные вопросы