2013-04-21 1 views
1

부모 폼에 DataTable을 사용하는 항목으로 채워진 comboBox가 있는데이 모양은 DataSource입니다. 내 부모 폼에서자식 폼이 닫힐 때 comboBox 새로 고침

 sourceTypes = myDataBase.SourceType.ToList<SourceTypes>(); 

     DataTable dt = new DataTable(); 
     DataColumn dc1 = new DataColumn("Name"); 
     DataColumn dc2 = new DataColumn("ID"); 

     dt.Columns.Add(dc1); 
     dt.Columns.Add(dc2); 

     foreach (SourceType sourceType in sourceTypes) 
     { 
      string sourceTypeName = sourceType.sourceTypeName; 
      string ID = sourceType.sourceTypeID.ToString(); 
      dt.Rows.Add(sourceTypeName, ID); 
     } 

     comboBox3.DataSource = dt; 
     comboBox3.ValueMember = "ID"; 
     comboBox3.DisplayMember = "Name"; 

은 내가 myDataBase에 새 레코드를 추가하는 내 자식 폼을 호출하고 난 자식 폼이 닫힐으로이 새로운 추가 기록이 바로 부모님의 형태 콤보 상자에 표시 할 것입니다. 그래서 나는 comboBox를 리프레시 할 childFrm에서 이와 같은 것을 호출하려고합니다.

 private void FrmChild_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      FrmParent.refresh(); 
     } 

이제 부모 폼에 정적 새로 고침 방법이 필요합니다. 실제로 작동하지 않습니다. 내가 어떻게 끝낼 수 있니? 건배

편집 : 나는이 (정적 방법)처럼 시도했지만 내 자식 폼에서

를 작동하지 않았다 :

private void button7_Click(object sender, EventArgs e) 
    { 
     FrmChild frmChild = new FrmChild(); 
     frmChild.ShowDialog(); 
     frmChild.Dispose(); 
    } 

EDIT2을 : 아이 양식은 여기 열립니다

 private void FrmChild_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      FrmParent frmParent = new FrmParent(); 
      frmParent.refresh(); 
     } 

상위 폼에 새 레코드가 myDataBase에 추가 된 후 새로 고침 메서드.

 sourceTypes = myDataBase.SourceType.ToList<SourceTypes>(); 

     DataTable dt = new DataTable(); 
     DataColumn dc1 = new DataColumn("Name"); 
     DataColumn dc2 = new DataColumn("ID"); 

     dt.Columns.Add(dc1); 
     dt.Columns.Add(dc2); 

     foreach (SourceType sourceType in sourceTypes) 
     { 
      string sourceTypeName = sourceType.sourceTypeName; 
      string ID = sourceType.sourceTypeID.ToString(); 
      dt.Rows.Add(sourceTypeName, ID); 
     } 

     comboBox3.DataSource = dt; 
     comboBox3.ValueMember = "ID"; 
     comboBox3.DisplayMember = "Name"; 

이렇게 시도하면 콤보 상자가 아직 새로 고쳐지지 않습니다.

+1

Refresh 메서드 호출 할 수 있습니다 어떻게 자식 폼은/폐쇄 열립니다? 모달 팝업을 사용하고 있습니까? – nmat

+0

부모 폼 자체에서 호출되었을 때'refresh' 메소드가 작동하는지 확인할 수 있습니까? 정적으로 만드는 이유가 있습니까? 자식 폼에서 액세스 할 수 있도록 정적으로 만들면 폼 인스턴스에 대한 참조를 전달할 수 있으므로이를 수행 할 필요가 없습니다. – keyboardP

+0

@keyboardP 네, 정적으로 만들어서 내 자식 폼에서 액세스 할 수 있습니다. 난 더 나은 메모리 관리 다음 자식 폼이 닫힐 때마다 새로운 parentForm 개체를 만드는 것 같아요. – Whizzil

답변

0

부모 폼을 자식 폼에 전달하고 해당 메서드를 호출 할 수 있습니다. 부모 폼을 취하는 자식 폼에 생성자를 만들고 refresh 메서드를 정적으로 만들지 마십시오. 또한 Closed 이벤트 대신 Closing 이벤트를 처리 해보십시오.

FrmChild 클래스 :

private FrmParent parentForm = null; 
public FrmChild(FrmParent pf) 
{ 
    parentForm = pf; 
} 

이제 closing, 당신이

private void FrmChild_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(parentForm != null) 
     parentForm.refresh(); 
} 

FrmParent 클래스

private void button7_Click(object sender, EventArgs e) 
{ 
    using(FrmChild frmChild = new FrmChild(this)) 
    { 
     frmChild.ShowDialog();  
    } 
} 
+0

감사합니다. 작동했습니다 :) – Whizzil

+0

@Whizzil - 오신 것을 환영합니다 :) 한 가지. 새로 고침 메서드는 전체 데이터 테이블을 다시 생성하지만 필요하지는 않습니다.여기에 표시된대로 데이터 소스 값만 새로 고칠 수 있습니다. http://stackoverflow.com/questions/14089342/refresh-combobox-items-easiest-way – keyboardP

관련 문제