2010-07-29 7 views
8

나 자신 만의 이벤트를 만들고 싶을 때 그들을 키우는 방법에 대해 궁금해하고있었습니다.C# WinForms에서 커스텀 이벤트 발생하기

아마 내 응용 프로그램 디자인도 엉망입니다.

MainWindow.TextBox 런타임에 매우 자주 업데이트되는 몇 가지 정보를 보유하고, 구조이 경우

ProgramContext 
- Form MainWindow 
    + Control TextBox 
    + Control Button 
    + ... 

입니다. 그래서, 나는 어떻게 든 그것을 원상태로 회복시킬 필요가있다. (데이터가 저장된 곳에서 데이터를 다시로드 할 수있다.)

EventHandlerValidating -Event에 후킹 해 보았지만 그럴 수 없었다. 속임수를 쓰려면.

그래서, 기본적으로 내가 ( table에 새로운 데이터를 기록) 다른 방법이 실행될 때마다 수행해야 할 ProgramContext

DataTable table = _adapter.GetData(); 
foreach (DataRow row in table.Rows) 
{ 
    MainWindow.TextBox.Text += table.Text.ToString(); 
} 

의 데이터를 다시로드하는 방법이있다.

아이디어가 있으십니까?

답변

13

편집 : 귀하의 질문은 특정 이벤트에 연결하는 것에 관한 것 같지만 아래의 FWIW는 일반적으로 맞춤 이벤트를 발생시키는 방법입니다.

, 외부 당사자가 폼의 텍스트 상자에서 발생한 이벤트를 모니터링 할 것을 이해에서 이벤트

변경 텍스트 상자를 처리 한 후 또 다른 형태의 데이터를 다시로드?

는 C#의 최신 버전으로, 양식의 텍스트 상자를 공개하는 것 그리고 다른 사람들이이 이벤트

MainForm.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 

를 구독 할 수 있습니다 또는 신속하고 더러운 :

MainForm.textBox1.TextChanged += this.textBox1_TextChanged; 

귀하의 추가 자신의 맞춤 이벤트

더 깨끗한 방법은 raise a custom event입니다. 아래 MyDataChangedEvent. 이렇게하면 변경 내용이 텍스트 상자에서 오는 사실을 추상화 할 수 있습니다.

// Assuming you need a custom signature for your event. If not, use an existing standard event delegate 
public delegate void myDataChangedDelegate(object sender, YourCustomArgsHere args); 

// Expose the event off your component 
public event myDataChangedDelegate MyDataChangedEvent; 

// And to raise it 
var eventSubscribers = MyDataChangedEvent; 
if (eventSubscribers != null) 
{ 
    eventSubscribers(this, myCustomArgsHere); 
} 

또한 엔터 해방 복합 응용 프로그램 차단 및 스마트 클라이언트 소프트웨어 공장에서 보일 수는 -이 UI "SmartParts"를 통해 동기화하기위한 매우 유연 이벤트 중개/퍼브 서브 메커니즘이 (컨트롤 등 대화 상자를 형성한다) 느슨하게 결합 된 방식으로(CAB은 이제 매우 날짜가 있음).

+3

예를 들어, 새 델리게이트를 선언하는 대신 public 이벤트 EventHandler MyEvent'와 같이 일반 EventHandler를 사용하는 것이 더 명확합니다. –

+0

'TextChanged'에 후킹을 시도했지만 무한 루프로 끝날 것입니다. 이벤트 핸들러 내에서 텍스트를 변경하려고합니다. –

+1

핸들러 내에서 텍스트를 변경할 수 있지만 메소드 지속 시간 동안 이벤트를 중단해야합니다.다음과 같이 할 수 있습니다 : 이 호출자에 대한 이벤트를 사용하지 않으려면'this.TextChanged - = SomeClassName_TextChanged'를 호출하고 메소드에서 몇 가지 작업을 수행 한 다음'this.TextChanged + = SomeClassName_TextChanged'를 호출하여 이벤트를 다시 활성화하십시오. – Nebula

관련 문제