2012-07-30 3 views
6

이 문제를 광범위하게 검색했지만 내 문제의 해결책을 찾을 수 없습니다. 해당 페이지의 사용자 정의 컨트롤에서 페이지의 코드 뒤에 함수를 호출하려고합니다.이벤트 처리기는 항상 null입니다.

마스터 페이지를 사용하는 웹 응용 프로그램이 있습니다. 내가 콘텐츠 페이지 중 하나에 쓴 사용자 정의 컨트롤을 추가하고 있습니다. 도구 상자에서 끌어서 놓아서 aspx 페이지에 사용자 정의 컨트롤을 추가했습니다. 뒤에있는 코드에서 사용자 정의 컨트롤을 볼 수 있지만 공용 함수에 액세스 할 수 없습니다. 이 문제를 해결하기 위해 코드 뒤에서 사용자 정의 컨트롤의 개체를 만들고 LoadControl 함수를 사용했습니다. 그것들 모두 잘 작동하는 것 같습니다.

내가 겪고있는 문제는 aspx 페이지에서 사용자 정의 컨트롤로 EventHandler를 연결하려고 할 때입니다. 모든 것이 컴파일되고 실행되지만 페이지에서 아무 것도 보이지 않습니다. 문제는 EventHandler가 항상 null이라는 것입니다.

사용자 컨트롤 코드

public partial class ucBuyerList : System.Web.UI.UserControl 
{ 
    public delegate void BuyerSelectedEventHandler(object sender, EventArgs e); 
    public event BuyerSelectedEventHandler BuyerSelected; 

    private string name = ""; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private string auid = ""; 
    public string AUID 
    { 
     get { return auid; } 
     set { auid = value; } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    private void OnBuyerSelected(EventArgs e) 
    { 
     if (BuyerSelected != null) 
     { 
      BuyerSelected(this, new EventArgs()); 
     } 
    } 

    protected void lbBuyerList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     SetNameAndAUID(); 
     OnBuyerSelected(e); 
    } 

    private void SetNameAndAUID() 
    { 
     name = lbBuyerList.SelectedItem.Text; 
     auid = lbBuyerList.SelectedItem.Value; 
    } 
} 

상위 페이지 코드

public partial class frmBuyerInformation : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Master.changePageTitle("Buyer Information"); 
     buyerList.BuyerSelected += new ucBuyerList.BuyerSelectedEventHandler(buyerListControl_BuyerSelected); 
    } 

    void buyerListControl_BuyerSelected(object sender, EventArgs e) 
    { 
     DisplayBuyerInformation(); 
    } 

    public void DisplayBuyerInformation() 
    { 
     tbName.Text = buyerList.Name; 
     tbAUID.Text = buyerList.AUID; 
    } 
} 

사람이 내가 뭘 잘못 볼 수 있을까요?

편집 :이 문제는 해결되었습니다. 위의 코드 스 니펫이 이제는 작동합니다. 누구든지 내가 가진 문제에 부딪히면 위 코드를 모델링 할 수 있습니다. aspx 및 ascx 페이지 모두에 AutoEventWireup="true"이 있는지 확인하십시오. 백포도주 솔루션에 감사드립니다. Diego De Vita에게도 감사드립니다.

+0

if (BuyerSelected! = null) {BuyerSelected (this, e); }'절대하지 마! 이 코드는 경쟁 조건을 만듭니다. 이것은 적절한 숙어입니다 :'var h = BuyerSelected; (h! = null) h (this, e);' – cdhowie

+0

몇 초 전에 다른 것을 썼습니다 .. 실제로 .. 당신의 의견을 보았고 동의하지 않을 수도 있습니다. 나는 항상 이벤트 클래스를 그런 식으로 시작했다. 즉, 이벤트에 첨부 된 이벤트 핸들러를 호출합니다. 지금 나는 그 질문을주의 깊게 읽지 않았으므로 나는 대답이 없다. 그냥 당신의 마지막 코멘트가 올바르지 않다는 것을 말합니다 –

+0

asp.net 컨트롤에서 lbBuyerList_SelectedIndexChanged를 그러한 이벤트의 처리기로 지정하면 ascx에서 선언적으로 적절한 태그 속성을 수정했는지 궁금합니다. 각 단계 (해당 메서드 본문에서 시작)에서 중단 점을 사용하고 해당 코드가 호출되면 디버그 중에 발견 할 수 있습니다. –

답변

2

나는 꽤 오랫동안 이벤트에 어려움을 겪어 왔습니다. 요즘 나는 항상 이런 식으로 만들어 낸다. 왜냐하면 그것이 내가 잘하는 유일한 방법이기 때문이다. 코드와 함께 테스트하지는 않았지만 어쨌든 진행됩니다.

부모 페이지에서 이미 수행 한 것과 같은 방식으로 함수를 호출 할 수 있습니다.

+0

다른 접근 방식을 가져 주셔서 감사합니다. 이 코드를 사용하려고했지만 "처리기"개체가 null 인 것으로 나타납니다. –

+0

이것은 자연스러운 추측이지만 if (! Page.IsPostback)에서 부모 페이지 page_load를 래핑하려고 시도 했습니까? –

+0

위에서 설명한 방법을 사용하도록 코드를 변경했습니다. 처음에는 작동하지 않았습니다. 나는 AutoEventWireup = "true"를 aspx와 ascx 페이지 모두에서 만들어야했습니다. 당신의 도움을 주셔서 대단히 감사합니다. 다른 사람들이 내가 그런 상황에 빠지면 사용할 코드를 게시 할 것입니다. –

1

LoadControl을 사용하고 이벤트를 구독하기 위해 페이지 수명주기에 너무 늦을 수 있습니다 (). 해당 코드를 Page_Init 메소드로 이동하면 어떻게됩니까?

+0

좋은 지적이 될 수 있습니다. 보통 사용자 정의 컨트롤을 프로그래밍 방식이 아닌 선언 ascx에 추가합니다. –

관련 문제