2010-05-27 6 views
6

단추가 포함 된 사용자 정의 컨트롤을 만들었습니다. 데이터베이스에서 데이터를 가져온 후 런타임에로드 될 winform에이 컨트롤을 사용하고 있습니다.사용자 컨트롤에 대한 대리자 및 이벤트 처리기를 사용하는 방법

이제 해당 단추의 Click 이벤트에서 데이터 테이블에서 행을 제거해야합니다.

문제점은 양식에서 해당 이벤트를 캡처하는 방법입니다. 현재 그것은 해당 사용자 정의 컨트롤의 btn 클릭 이벤트 정의에 있습니다.

답변

18

당신은 사용자 정의 컨트롤 내에서 다음을 수행하여 자신의 대리인 이벤트를 만들 수있는 것은 :

protected void YourButton_Click(object sender, EventArgs e) 
{ 
    if (this.InnerButtonClick != null) 
    { 
     this.InnerButtonClick(sender, e); 
    } 
} 

그런 다음에 연결할 수 있습니다 :

public event UserControlClickHandler InnerButtonClick; 
public delegate void UserControlClickHandler (object sender, EventArgs e); 

당신은 다음을 사용하여 핸들러에서 이벤트를 호출 이벤트 사용시

UserControl.InnerButtonClick+= // Etc. 
+0

멋진 닉 :), 당신은 그것을 약간 xplain하시기 바랍니다. 대리자, 이벤트 및 인터페이스에 대해 많이 알지 못합니다. 어떻게 작동합니까? 버튼이 클릭되었음을 어떻게 인식합니까? –

+1

기본적으로 대리자는 지정된 함수를 가리키고 있습니다. 대리인은 멀티 캐스트이므로 여러 메서드를 동시에 가리킬 수 있습니다. 나는. 위임자를 한 번 호출하면 첨부 된 모든 메서드가 실행됩니다. 이 질문에서 인터페이스와 관련이 없으므로 설명 할 필요가 없습니다.하지만 검색을 수행하면 인터페이스에 대한 많은 질문이 있습니다. – GenericTypeTea

+0

공개 이벤트 int funName을 쓸 수없는 이유는 무엇입니까? 실제로 사건에 의해 받아 들여지는 것은 무엇입니까? –

3

새 delega를 선언 할 필요가 없습니다. 테. 귀하의 사용자 정의 컨트롤에서 :

public class MyControl : UserControl 
{ 
    public event EventHandler InnerButtonClick; 
    public MyControl() 
    { 
    InitializeComponent(); 
    innerButton.Click += new EventHandler(innerButton_Click); 
    } 
    private void innerButton_Click(object sender, EventArgs e) 
    { 
    if (InnerButtonClick != null) 
    { 
     InnerButtonClick(this, e); // or possibly InnerButtonClick(innerButton, e); depending on what you want the sender to be 
    } 
    } 
} 
+0

어딘가에 innerButton에 대한 정의가 필요하지 않습니까? 이게 누락 된 조각인가요? – 1337Rooster

+0

InnerButtonClick은 다음 행으로 정의됩니다. "public event EventHandler InnerButtonClick;" 특수 이벤트 핸들러가 필요하지 않은 경우 기본 이벤트 핸들러를 재정의 할 필요가 없습니다. –

관련 문제