2012-10-26 2 views
1

DataGridView 컨트롤에 일부 데이터를 표시하는 응용 프로그램을 만들었습니다. 데이터는 SQL 데이터베이스에 저장됩니다. 이 특정 디스플레이에 대한 매개 변수가 많기 때문에 사용자가 데이터베이스에 데이터를 추가하거나 대체하는 데 도움이되는 동일한 프로젝트에 다른 (하위) 양식을 만들었습니다. 추가 기능과 교대 기능 모두 제대로 작동하지만 DataGridView의 데이터는 변경되지 않습니다. DataGridView의 DataSource를 새로 고치는 방법을 알고 있지만 그 함수를 다른 양식으로 트리거하는 방법을 모르겠습니다. 다음 그래서 다른 (하위) 형태에서 액세스 할 수있을 것다른 양식에서 dataGridView의 데이터 소스 새로 고침

private void RefreshMyDGV() 
{ 
    command.CommandText = "SELECT * FROM MyDataBase"; 
    SDA.SelectCommand = command; 
    SDA.Fill(myDataTable); 
    dataGridView1.DataSource = MyDataTable; 
} 

내가 공공 정적 기능으로이 기능을 변경하려고했지만 :

는 내가있는 DataGridView의 데이터 소스를 새로 고치려면이 기능을 사용 컴파일러는 "비 정적 필드, 메소드 또는 속성에 객체 참조가 필요합니다"라는 오류를 발생시킵니다.

나는 또한 다른 형태에서 액세스 한 다음 공개로 된 DataGridView를 정의하고, 시도 :

((Form1)fr1).dataGridView1.DataSource = myDataTable; 

을하지만 그 중 하나가 작동하지 않았다.

이 방법을 제안하십시오. 감사합니다. .

+0

(아이) 양식 "은 원래 양식의 인스턴스에 대한 참조가없는 것처럼 들립니다. 그게 사실이야? 이 경우, fr1은 무엇입니까? 공용 인스턴스 멤버를 그리드 새로 고치고 해당 인스턴스 멤버를 아무 문제없이 호출 할 수 있어야합니다. 데이터 소스를 null로 설정하면 어떻게됩니까? 그리드가 지워 집니까? –

답변

4

문제는 static입니다. 그렇게 할 필요는 없습니다. 그냥 public으로 만드십시오. 에서 공용 함수를 호출하기 위해
http://msdn.microsoft.com/en-us/library/aa645629(v=vs.71).aspx

, 당신은 부모 폼 예를 (단지 클래스)에 대한 참조가 필요합니다

정적 및 인스턴스 방법의 차이에서이 문서를 참조하십시오 귀하의 자녀 양식. (실제 부모 폼의 유형을 대체 할) 유형 ParentFormLogicalParent라고 자녀 양식에 속성을 추가 (이 이미 ParentParentForm을 명명 된 속성입니다,하지만 그들은 다른 것에 사용하고 당신이 그들을 사용하지 말아야) :

public ParentForm LogicalParent{ get; set; } 
이제

, 부모 폼에,이 속성을 설정 자식 폼의 새 인스턴스를 열 때 바로보기 기능을 호출하기 전에 : 자식 폼에 지금

ChildForm l_childForm = new ChildForm(); 
l_childForm.LogicalParent = this; 
l_childForm.Show(); 

을, 당신은에 대한 참조가 부모의.이제 대중 함수를 호출 할 수 있습니다 :

this.LogicalParent.RefreshMyDGV(); 

이 대안 :

부모 폼에

에서, ShowDialog 함수에 부모 폼에 대한 참조를 전달합니다

ChildForm l_childForm = new ChildForm(); 
l_childForm.ShowDialog(this); 

자, 자식 창 Owner 속성을 통해 부모 폼에 액세스 할 수 있습니다. 그러나 Owner 속성을 상위 폼의 유형으로 캐스팅해야합니다. 그래서, 자식 형태 :

((ParentForm)this.Owner).RefreshMyDGV(); 

MDI :

당신이 MDI 환경 (당신은 그게 뭔지 모른다면이 무시)를 사용하는 경우, 당신은 ParentForm을 사용할 수 있습니다 속성을 위의 Owner 속성과 동일한 방식으로 사용합니다 (부모 유형으로 캐스팅해야 함). MDI 환경은 설명하기가 더 복잡합니다. 사용하지 않는 것이므로 여기서 설명하지 않겠습니다. 자세한 정보가 필요하면 방문 : 당신이 사용하는 것 대신에 childform.Show();

그런 자식 폼의 DialogResult를을 http://msdn.microsoft.com/en-us/library/xyhh2e7e.aspx

+0

나는 그것을했고, "Non static field required"오류를 다시 던졌습니다. – NDraskovic

+0

@NDraskovic - 업데이트 된 답변보기. – JDB

+0

죄송합니다,이 사이트에는 분명히 몇 가지 문제가 있으며 전체 답변을 표시하지 않았습니다. LogicalParent를 추가하면 문제가 완벽하게 해결됩니다. 고맙습니다. – NDraskovic

0

나는 RefreshMyDGV() 메소드를 public으로 만들 것이다. 그런 다음 자녀 양식의 부모를 통해 액세스 할 수 있습니다.

데이터 바인딩을 재설정하면 바인딩이 트릭을 수행해야합니다.

dataGridView1.ResetBindings() 
+0

부모에게 물마루로 접근한다는 것은 무엇을 의미합니까? 코드 샘플을 제공해 주시겠습니까? – NDraskovic

0

당신이 사용할 수있는 childform.ShowDialog();

ParentForm 지금 전에 DialogResult를 기다립니다 계속됩니다

자식 폼에서 데이터베이스를 성공적으로 변경하면 대화 상자 결과

을 설정할 수 있습니다 childForm에서

: parentForm에서

try 
{ 

//alter database 

//set DialogResult 
this.Dialogresult = DialogResult.OK; 

} 

catch(System.Exception) 
{ 
//Error Message 
this.Dialogresult = DialogResult.NO; 
} 

: 당신은 내가 그래서 다른에서 액세스 할 수있을 것입니다 공공 정적 기능으로이 기능을 변경하려고 "라고

ChildForm cf = new ChildForm(); 
cf.ShowDialog(); 

if(cf.DialogResult = DialogResult.OK) 
{ 
    //SET DATASOURCE 
} 
관련 문제