2013-07-01 2 views
0

DataGridView를 보유하는 Form이 있고,이 Form은 다른 DataGridView 만 보유하는 보이지 않는 Form을로드합니다. 두 번째 DGV는 첫 번째 DGV의 항목에 대한 자세한 정보를 표시하는 데 사용됩니다.DataGridView 외부에서 클릭 할 때 폼을 숨기기

두 번째 DGV는 사용자가 첫 번째 DGV에서 임의의 행의 7 번째 셀 내부를 클릭 할 때만 표시되어야합니다. 나는 다른 셀을 클릭 할 때 숨길 수 있도록 이미 관리했지만 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

의견을 보내 주시면 감사하겠습니다. 전체 그리드를 formsize로 크기를 정하는 대신, 필자는 자동 크기 조정을 패널에 적용하여 차례대로 크기를 폼 크기로 조정했습니다. Panel_Click 이벤트로 이제 두 번째 폼을 숨길 수 있습니다. – LeonidasFett

1

폼 클릭과 그리드 휴가 이벤트를 결합하여 작동 시키려고한다고 생각합니다.

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

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

사용자가 양식에서 그리드 외부를 직접 클릭하거나 다른 컨트롤로 직접 클릭하면 세부 양식이 숨겨져 야합니다.

희망이 있습니다.

관련 문제