2012-06-06 2 views
0

주소 사용자 정의 컨트롤이 있습니다.페이지에서 사용자 정의 컨트롤을 두 번 사용할 때 하나의 사용자 정의 컨트롤에서 이벤트 및 위임 문제 발생

내 페이지에는 회사 주소 용과 메일 주소 용으로 두 개의 주소를 사용합니다. 그래서 내 주소 사용자 정의 컨트롤을 페이지에서 두 번 사용합니다.

이 주소 사용자 정의 컨트롤에서 사용자가 우편 번호를 채우면 DataBase에서 주소와 건물 주소를 가져 와서 해당 사용자의 텍스트 상자를 채 웁니다.

하지만 내 문제는 사용자가 하나의 우편 번호를 채울 때마다 두 주소록 사용자 정의 컨트롤이 동일한 데이터로 채워지는 것입니다.

여기 모두 * AddressForService_APICall * & MailAddressForService_APICall 이벤트가 발생 txtPostalCode_TextChanged 어드레스 사용자 제어

public delegate void AddressForServiceHandler(string callType, string refreshType, Dictionary<string, string> keyvalues); 
public delegate void MailAddressForServiceHandler(string callType, string refreshType, Dictionary<string, string> keyvalues); 
public event AddressForServiceHandler AddressForService_APICall; 
public event MailAddressForServiceHandler MailAddressForService_APICall; 


protected void txtPostalCode_TextChanged(object sender, EventArgs e) 
    { 
      #region delegate func 
      Dictionary<string, string> Params = new Dictionary<string, string>(); 
      Params.Add("PostalCode", txtPostalCode.Text.Trim()); 

      if (AddressForService_APICall != null) 
      { 
       AddressForService_APICall(txtPostalCode.Text, "PostalCode", Params); 
      } 
      if (MailAddressForService_APICall != null) 
      { 
       MailAddressForService_APICall(txtPostalCode.Text, "PostalCode", Params); 
      } 
      #endregion 

    } 

내 샘플 코드이므로, 모두 주소록의 사용자 제어는 동일한 데이터로 채워진다.

이 상황을 어떻게 처리해야합니까? 하나의 해당 Address 사용자 정의 컨트롤 만 채우고 싶습니다. 미리 감사드립니다.

케빈

UPDATE 여기

데이터를 채울 것입니다 내 코드입니다. 이 코드는 aspx 페이지로 코딩됩니다. AddressForService 및 MailAddressForService가이 개 된 UserControls를 포함하는 형태로 정의하는 동안

질문 광고에서
protected void InitializeEvents() 
    { 
     Address1.AddressForService_APICall += new AddressForServiceHandler(AddressForService); 
     Address2.MailAddressForService_APICall += new MailAddressForServiceHandler(MailAddressForService); 
    } 


protected void AddressForService(string callType, string refreshType, Dictionary<string, string> keyvalues) 
    { 
     try 
     { 
      using (ServiceAddress cmProxy = new ServiceAddress()) 
      { 
       Dictionary<string, string> dsPostalCode = new Dictionary<string, string>; 
       dsPostalCode = cmProxy.GetAddress(callType, refreshType, keyvalues);// it will return the dictionary filled with the data 
       Address1.RefreshAddressForRegistration(dsPostalCode); // here I call address control method to fill the data 
      } 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 

    protected void MailAddressForService(string callType, string refreshType, Dictionary<string, string> keyvalues) 
    { 
     try 
     { 
      using (ServiceAddress cmProxy = new ServiceAddress()) 
      { 
       Dictionary<string, string> dsPostalCode = new Dictionary<string, string>; 
       dsPostalCode = cmProxy.GetAddress(callType, refreshType, keyvalues); 
       Address2.RefreshAddressForRegistration(dsPostalCode); 
      } 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 
+0

전체 주소 표시를 담당하는 코드를 게시 할 수 있습니까? – Larry

+0

거기에 두 개의 똑같은 (이름에 대해) 종류의 대의원이있는 특별한 이유가 있습니까? –

+0

하나의 대리자 만 사용해도 그 결과는 같습니다. 두 명의 대표와 함께 시도했지만 여전히 동일합니다. – kevin

답변

1

여러분의 의견은, 난 (도, 주소 1을 txtPostalCode 당신의 UserControl의 일부임을 이해하고 txtPostalCode_TextChanged은 당신의 UserControl에 정의되어 있음 그리고 Address2, 나는 생각한다).

이 경우 txtPostalCode_TextChanged 구현은 폼에 두 개의 컨트롤이 있음을 이미 알고있는 것처럼 생각됩니다. 당신은 아마 간단하게 다음과 같이 단일 한 개 이벤트를 대체해야합니다

public delegate void AddressForServiceHandler(string callType, string refreshType, Dictionary<string, string> keyvalues); 

public event AddressForServiceHandler PostalCodeChanged; 

protected void txtPostalCode_TextChanged(object sender, EventArgs e) 
    { 
      Dictionary<string, string> Params = new Dictionary<string, string>(); 
      Params.Add("PostalCode", txtPostalCode.Text.Trim()); 

      if (PostalCodeChanged != null) 
      { 
       PostalCodeChanged(txtPostalCode.Text, "PostalCode", Params); 
      } 
    } 

그런 다음 당신이 된 UserControls를 사용하는 형태로, 코드가 있어야한다 :

protected void InitializeEvents() 
    { 
     Address1.PostalCodeChanged += new AddressForServiceHandler(AddressForService); 
     Address2.PostalCodeChanged += new AddressForServiceHandler(MailAddressForService); 
    } 

을 당신이이 이런 식으로 주소, Address1 및 Address2를 나타내는 UserControls이 텍스트 필드 (txtPostalCode)는 변경할 때 txtPostalCode_Changed를 실행합니다.이 텍스트 필드는 사용자 컨트롤에 대해 PostalCodeChanged를 실행합니다.

InitializeEvents에서는 두 가지 방법으로 사용자 컨트롤의 PostalCodeChanged 이벤트를 구독합니다. 즉, Address1의 txtPostalCode가 변경되면 PostalCodeChanged가 Address1 컨트롤에 대해서만 실행되고 해당 이벤트에 구독 된 메서드 만 실행되고 Address2의 동일한 이벤트에 연결된 메서드는 실행되지 않습니다.

두 가지 방법 (AddressForService 및 MailAddressForService)이 여전히 실행되는 경우 코드에 다른 부분이 있어야합니다. 내가 그것을 디버깅하려고, 실행 (MailAddressForService) 안되면 메서드에서 중단 점으로 Address1에 txtPostalCode 변경. 그런 다음 어떻게 호출 스택에 있는지 살펴보고 Address1의 PostalCodeChanged 이벤트를 검사하여 해당 이벤트에 가입되어 있는지 확인합니다.

+0

나는 아직도 두 가지 사건을 일으킬 것이라고 생각한다. 귀하의 의견에 감사드립니다. 나는 시도 할 것이고 당신에게 결과를 알려줄 것이다. – kevin

+0

txtPostalCode_TextChanged가 UserControl 내부에 정의되어 있으면 안됩니다. –

+0

여전히 두 이벤트를 모두 발생시킵니다. 내가 잘못하지 않았다면,이 PostCodeChanged 이벤트는 구독 한 모든 이벤트를 시작합니다. – kevin

관련 문제