2012-07-28 2 views
1

크로스 스레드 예외를 던지는 dataGridView에 바인딩 된 다른 스레드의 데이터를받는 데이터 구조 (bindingList)가 있습니다. dataBound 인 dataGridView를 호출하려면 어떻게해야합니까? 이것은 winForm 프로젝트입니다. 저는 여기에 명확성을 위해 무슨 말인지의 예다른 스레드의 데이터가있는 DataBinding 그리드

DataStore dStore = new DataStore(); 
dStore.ReceiveData += new ReceiveDataEventHndlr(data); 
BindingList<mydataobj> myDataStructure = new BindingList<mydataobj>(); 
dataGridView.DataSource = myDataStructure; 

// here's my cross threading issue 
private void data(string s, double d) 
{ 
    myDataStructure.Add(new MyDataObj(s,d)); 
} 

답변

3

당신은 다른 스레드에서 Control.Invoke 수정 컨트롤을 사용해야합니다

private void data(string s, double d) 
{ 
    if (this.InvokeRequired) { 
     this.Invoke(new Action(() => {data(s, d);})); 
     return; 
    } 
    myDataStructure.Add(new MyDataObj(s,d)); 
} 

은 첫째, 당신은 Control.InvokeRequired 경우를 확인하십시오. 그렇다면 같은 함수에 대한 대리자가있는 Invoke()을 호출 한 다음 반환하십시오. GUI 스레드에서 함수를 다시 입력하면 InvokeRequiredfalse이되고 컨트롤이 업데이트됩니다.

+0

오케이 ... 나는 dataStructure를 호출하면이 문제를 해결할 수 있는지 몰랐습니다. 내가 dataGridView를 호출해야한다고 생각했다 –

+0

아니, 할. 당신은 컨트롤 (데이터 그리드 뷰)에 대한 호출을 호출 –

+0

나는 understaning 아니에요. 어쩌면 내가 더 명확히해야합니다 : 내 dataGridView 내 프레젠테이션 계층 (GUI)에 있습니다. myDataStructure와 dStore는 내 busins ​​논리 계층 (BAL) 내에 있습니다. 내 dStore와 myDataStructure는 dataBinding 이외의 다른 dataGridView와 상호 작용하지 않습니다 ... 바인딩을 위해 myDataStructre를 GUI로 전달하면됩니다. –