웹 사용자 정의 컨트롤의 이벤트 핸들러를 코드 숨김으로 어떻게 등록합니까?


1

양식에 이벤트를 설정하는 데 문제가 있습니다. 여기에 설정이 있습니다 :

두 개의 컨트롤이있는 페이지가 주어졌습니다. 최종 사용자가 채울 표준 버전과 고급 버전의 두 가지 버전이 있습니다. 두 형식은 서로 다른 코드와 자바 스크립트를 가지고 있으므로 원래의 개발자는 별도의 웹 사용자 컨트롤에 넣습니다. 컨트롤과는 별도로 고급 모드로 전환하는 LinkButton이 있습니다.

<uc1:Standard runat="server" ID="StandardForm" /> 
<uc1:Advanced runat="server" ID="AdvancedForm" /> 
<asp:LinkButton runat="server" ID="lnkAdvanced" Text="Go To Advanced" OnClick="lnkAdvanced_Click" /> 

lnkAdvanced_Click은 현재 고급에 입력 된 모든 정보를 가져 와서 표시를 뒤집습니다.

내 문제는 보스 중 한 명이 표준 양식 안에 '고급으로 이동'버튼을 원하지만 .Visible 코드가 페이지에 있습니다. 그래서 이벤트를 사용하여 수행 할 수 있다고 생각했지만 작동하지 않는 것 같습니다.

나는이 같은 이벤트를 설정하려고 :

public event EventHandler AdvanceClick; 

protected void lnkAdvanced_Click(object sender, EventArgs e) { 
    AdvanceClick(sender, e); 
} 

을 그리고 문제가 해결되지 않았을 때, 나는 대리자를 설정하려고 : 나는에있는 버튼을 이동하면

public delegate void AdvancedEventHandler(object sender, EventArgs e); 
public event AdvancedEventHandler AdvanceClick; 

을 표준 양식, 나는 같은 것을 입력 할 수있을 것으로 예상했다 :

StandardForm.AdvanceClick += new AdvancedEventHandler(GoToAdvanced); 

그러나 그것은 심지어 어떤 것도 인식하지 못하는 것 같습니다 컨트롤 내의 TS! 오류 : "표준에 'AdvanceClick'에 대한 정의가없고 확장 방법이 없습니다. 'Standard'유형의 첫 번째 인수를 수락하는 AdvanceClick을 찾을 수 있음"다른 속성을 올바르게 찾았으므로 잘못된 점이 있습니다. 방법?

  0

어떻게 이벤트를 선언 했습니까? 22 feb. 092009-02-22 06:48:21

  0

뭔가가 전체 컨트롤 설정이 잘못되었음을 알려주지 만 자세한 내용 없이는 당신을 도울 수 없습니다. 나는 당신이 이미 더 자세한 내용을 제공했음을 안다. 그러나 나는 그것만으로는 충분하지 않다고 생각한다. 적어도 여러분은 다양한 코드 스 니펫이 어떤 파일에 있는지 알려 주어야합니다 ... page1.aspx, control1.ascx 등 ... 22 feb. 092009-02-22 07:27:45

  0

모두에게 올바른 방법으로 설정하려고했음을 확인해 주셔서 감사합니다. 이벤트를 참조 할 수 없다는 것이 나를 미치게 만들었습니다. 22 feb. 092009-02-22 17:27:57

0

표준 양식에 "고급 전환"버튼이있는 경우. 그렇다면 분명히 고급 형식에 대해 알아야하므로 꽤 밀접하게 결합 된 것 같습니다.이 경우 표준 양식의 하위 항목으로 고급 형식을 사용하는 것이 좋을 것 같습니다. 또는 더 좋지만 한 가지 컨트롤로 병합 할 수도 있습니다.

이러한 옵션이 마음에 들지 않으면 단추와 두 가지 서식을 호스트하는 세 번째 컨트롤과 데이터를 이동하고 표시 여부를 전환하는 논리를 만들 수 있습니다.

저는 개인적으로 단일 제어 옵션을 권장합니다. 딱딱하게 결합 된 통제를하면 대개 길을 혼란에 빠지게됩니다. 의존성을 여러 가지 방법으로 완화 할 수는 있지만 그렇게하기 전에 의존성을 열심히 생각하십시오.

현재 진행중인 레거시 프로젝트에는 serach 양식과 검색 결과가 여러 컨트롤로 분리되어 있지만 결국에는 다른 인스턴스가 제대로 작동해야하는 등 많은 예제가 있습니다. 앞서 말했듯이, 나는이 길을 추천하지 않을 것이다.

  0

이러한 컨트롤은 단단히 결합 할 필요가 없습니다. 로직이 호스트 페이지에 위임 된 경우 호스트가해야 할 일을 알아야하기 때문에 표준 컨트롤을 수정하지 않고도 언제든지 "고급 모드"를 아무 때 나 전환 할 수 있습니다. 이벤트를 노출하는 것이 전체 이점입니다. 22 feb. 092009-02-22 08:04:45

  0

"고급으로 이동"버튼에는 실제로 얼마나 많은 용도가 있다고 생각합니까? 제 말은, 진보 된 형태로 전환하는 것이 결코 아니란 것입니다. 그렇다면 버튼이 호스팅 페이지/컨트롤에 있어야하는 표준 양식에는 아무 것도 없다고 생각하지 않습니다. 22 feb. 092009-02-22 12:28:21

  0

이 설정은 단지 우스운 냄새가 난다. 나는 모든 사람들이 그것을 만들려고 노력하는 것처럼 거의 복잡하지 않다고 생각하지 않습니다. 컨트롤 요구 사항, 사용 사례 및 서로에 대한 관계에 대해 더 알고 싶습니다. 표준 및 고급 컨트롤은 한 번에 하나씩 사용하도록되어 있지 않습니다. ;) 22 feb. 092009-02-22 12:38:53

  0

동의. 뭔가 틀린 설정이 필요합니다. 시간을 보내고 생각해 보지 않고 양식을 컨트롤에서 패널로 가져와 "무엇이든 작동합니다"라고 말합니다. 모두의 도움에 감사드립니다! :) 22 feb. 092009-02-22 17:25:01


0

표준 이벤트를 만들었으므로 위임자가 필요하지 않습니다. 양식로드 또는 그 부근에서

시도 : 2 사용자를 호스팅 그리고 어딘가에 페이지

StandardForm.AdvanceClick += new EventHandler(GoToAdvanced); 

는 제어

protected void GoToAdvanced(object sender, EventArgs e) 
{ 
    //Code that was previously in lnkAdvanced_Click on page. 
} 

편집 : 설정이처럼

그것은 소리 않습니다 잘못된.

호스트 페이지에 대한 마크 업을 게시 할 수 있습니까?이 시점에서 우리는 간단히 2 개의 사용자 컨트롤이라고 가정합니다.

그런 다음 AdvanceClick 이벤트가 표준 UC에서 선언되었지만 오류 메시지가 나타나지 않고 lnkAdvanced_Click 메서드가 표준 UC에 있다고 가정합니다.

그러면 사용자 지정 이벤트에 연결하려고 시도하는 코드가 호스트 페이지에 선언되어 있다고 가정합니다.

가정을 확인하거나 거절 할 수 있다면 확실하게 처리 할 수 ​​있습니다.


1
//in your Standard user control 
public event EventHandler AdvancedClick; 

private void lbtnAdvanced_Click(object sender, EventArgs e) 
{ 
    OnAdvancedClick(e); 
} 

protected void OnAdvancedClick(EventArgs e) 
{ 
    if (AdvancedClick != null) 
     AdvancedClick(this, e); 
} 

//on your page 
StandardForm.AdvancedClick += new EventHandler(StandardForm_AdvancedClick); 

private void StandardForm_AdvancedClick(object sender, EventArgs e) 
{ 
    //toggle logic here 
} 
  0

이 방법은 논리를 호스트 페이지에 위임하는 대신 표준 양식과 고급 양식을 함께 연결합니다. 컨트롤의 결합이 문제가되지 않는 한, 일반적으로 필요하지 않을 때 이것을 피할 것입니다. 22 feb. 092009-02-22 07:16:42

  0

동의, 나는 그의 토글 논리가 페이지에 있었다는 사실에주의를 기울이지 않았다. 그에 따라 내 대답을 업데이 트했습니다. 22 feb. 092009-02-22 07:25:10