2009-07-18 4 views
1

기본적으로 페이지로드시 페이지에 동적으로 자리 표시자를 추가했습니다.ASP.net 동적으로 컨트롤 이벤트 처리를 만듭니다.

그런 다음 특정 페이지 이벤트에 대한 런타임 중에 자리 표시 자에 추가되고 합성 컨트롤이 표시됩니다. 복합 컨트롤에는 버튼이 있습니다. 복합 컨트롤에서 사용할 수있는 버튼에 대한 공개 이벤트 핸들러가 있지만 실제로 페이지 코드에서이 이벤트 핸들러에 직접 액세스 할 필요는 없습니다. 나는 내가 내 이벤트 핸들러를 연결할 create()를 호출 할 때

MyControl.Create(args, new EventHandler(OnClick)); 

그런 다음 페이지에서 나는 물론 protected void OnClick(object o, EventArgs args) {}

있을 것입니다 :

컨트롤을 표시하려면, 내가 예를 들어 다음 호출을 만들 것 복합 컨트롤의 버튼 클릭 이벤트. 여태까지는 그런대로 잘됐다. 단추가 연결된 상태에서 단추 클릭은 예상대로 컨트롤에 다시 게시됩니다. 그러나 이벤트는 결코 페이지의 이벤트 핸들러로 돌아 가지 않습니다.

포스트 백에서 문제가 발생한다는 것을 알고 있습니다. 그러나 init, load 또는 createchildcontrols에서 버튼을 연결하려고하면 와이어 링이 유지되어 페이지에서 이벤트를 처리 할 수 ​​없습니다. 필자가 원하는 것은 런타임 중에 이벤트 핸들러를 복합 컨트롤에 전달하고 복합 컨트롤이 이벤트를 포스트 백의 페이지로 올바르게 다시 보내도록하는 것입니다.

흥미롭게도 커스텀 eventargs로 OnBubble을 호출하면 페이지에서 버블 링 된 이벤트를 잡을 수 있습니다. 그러나 문제는 내 자리 표시자가 페이지에 있으므로 예를 들어 MyControl.Create()을 UserControl에 호출하려고하면 거품이 페이지로 이동하고 예상대로 UserControl에는 표시되지 않습니다. 따라서, 내가 대신 OnBubble (UserControls 및 MyControl을 선언하는 다른 컨트롤은 버튼 클릭 이벤트에 대해 쓸데없는 렌더링)을 재정의하는 대신 이벤트 핸들러를 선언하는 것이 좋습니다.

저는 누군가가 문제에 대한 통찰력을 가지기를 바랍니다. 흥미로운 문제인 것처럼 보이지만 페이지에 명시 적으로 컨트롤을 선언하고 마크 업 또는 페이지로드 중 하나에서 직접 이벤트를 연결하는 것 외에는 해결 방법이 없습니다. 단추를 비동기 콜백으로 만드는 방법을 고려해 볼 수 있지만 가능한 경우 표준 ASP.NET 이벤트 처리를 사용하는 것이 좋습니다.

감사합니다.

설명을 추가하려면 MyControl.Create() 호출은 실제로 복합 컨트롤의 Create() 메서드를 호출하는 이벤트를 생성합니다. 이것은 모두 훌륭하고 훌륭하지만, MyControl.Create() 메서드가 컨트롤에 직접 액세스 할 수 없다는 점은 주목할 가치가 있습니다. 이 컨트롤은 태그가 아닌 onload 페이지에 추가되어 있기 때문에 의미가 있습니다.

더 코드 :

MyControl : CompositeControl 
{ 
    public event EventHandler Click; 

    //I have a create method 
    void Create(args, EventHandler click) 
    { 
      this.Click = click; 
      //other processing 
    } 

    //then the button is wired up. I've tried in OnInit(), OnLoad() 
    void CreateChildControls() 
    { 
      MyButton.OnClick += Click; 
    } 

    //if I wire up the button to a default handler I can check if 
     Click is not null and send the click event onto the next handler 
    //this is where the bubble event works, but the wiring fails 
} 

편집 : 세션 및 와이어 최대 포스트 백에있는 버튼을의 이벤트 핸들러를 저장하는 나의 시도는 성공적이었다. 나는이 좋은 습관을 고려하지 않고 실제로 그것이 나의 목적을위한 것이라고 생각하지 않는다. 예를 들어,이 경우 페이지의 이벤트는 예상대로 실행되지만 비표준 페이지 동작을합니다. 예를 들어 Response.Redirect()는 예외를 throw합니다. eventhandler가 포스트 백 동안 상태 정보를 잃어 버렸기 때문에 이것은 의미가 있습니다. 몇 가지 생각 : 1.이 컨트롤과 어떻게 든 관련이있는 사용자 지정 풍선 이벤트를 만들 수 있습니까? 이것은 그럴듯 해 보이지만, 다시 페이지 포스트 백의 문제는 버블이 어디로 가야하는지의 동일한 문제로 나를 남겨 둡니다.그래서, create()를 호출하면 자동으로 UserControl을 거품의 대상으로 등록 할 수 있습니까? 그것은 어려워 보입니다. 2. 페이지 수명주기에서 UserControl 선언 된 이벤트 핸들러에서 이벤트를 다시 연결할 수있어 포스트 백에서 대리자가 올바르게 호출 될 수 있습니까? 이것은 내가 놓친 것 같다. 이벤트 핸들러는 포스트 백에서 작성되지만 OnClick 중 UserControl에서 다시 작성되지 않으므로 손실됩니다. UserControl이 명시 적으로 다시 만들어야하지만, 자식 컨트롤이 UserControl에 대해 다시 만들어 지도록하고 싶지는 않습니다. 그것은 간단한 요청처럼 들리지만, UserControl을 사용하여 불가능한 것을 요구할 수 있습니다.

+0

실제로 처리기를 연결하는 코드를 더 게시 할 수 있습니까? – user134706

+0

나는 거기에 이벤트 처리기를 저장하여 메모리 누출을 확신한다.) – user134706

답변

0

동적으로 컨트롤을 자리 표시 자에 삽입하려는 동기는 무엇입니까? 요청간에 페이지가 실제로 존재하지 않으므로 동적으로 삽입 된 컨트롤은 생존하지 못합니다. 당신은 기본적으로 그것을 가짜로 만들어야합니다.

다른 렌더링 모드는 있지만 일관된 이벤트 인터페이스가있는 사용자 지정 컨트롤을 작성하는 것이 좋습니다. 또 다른 방법은 ASP.NET MultiView 컨트롤을 사용하는 것입니다.이 컨트롤은 HTML에서 보이는 뷰만 렌더링하지만 보이지 않는 뷰에서는 이벤트 핸들러를 유지 관리합니다.

+0

응답 해 주셔서 감사합니다. 컨트롤은 여러 응용 프로그램과 거의 모든 페이지에서 자주 사용됩니다. 컨트롤을 페이지에 동적으로 삽입하려는 주된 동기는 httpmodule을 사용하여 .config 파일의 한 줄을 사용하여 컨트롤을 삽입 할 수 있도록하는 것입니다 ... 개발의 용이성, 코드 재사용의 용이성 및 페이지 유지 관리 용이성을 위해. 제안에 감사 드리며 그 내용을 자세히 살펴 보겠습니다. 거기에 사용할 수있는 솔루션을 찾으면 다시 게시 해 드리겠습니다. –

0

내가 틀렸다면 Create() 메서드가 실제로 인스턴스를 생성하고 내부 컨트롤을 알려진 상태로 설정합니다. 이미 버튼에 대한 참조가 있다는 것을 알았습니까? 그렇다면이 시점에서 추가 Click 이벤트가 필요한 이유는 무엇입니까?

Create()를 호출하면 컨트롤과 버튼이 초기화되고 버튼이 있다는 것을 알게되면 거기에있는 매개 변수를 전달하는 이벤트 핸들러를 연결합니다.

MyControl : CompositeControl 
{ 
    void Create(args, EventHandler click) 
    { 
     // init & set up your control 

     // other processing 

     MyButton.OnClick += click; 
    } 
} 
+0

이벤트 핸들러 자체는 상위 페이지 또는 UserControl에서 선언됩니다. 실제로 추가 이벤트 처리기가 필요하지 않지만이 이벤트는 포스트 백에서 손실되기 때문에 컨트롤에 하나를 작성하여 이벤트를 catch하고 OnBubble을 호출 할 수 있습니다. 나는 이벤트 핸들러를 세션에 저장하고 oninit 또는 onload를 호출하면 Page 또는 UserControl이 이벤트를 캡처하지만 안정 상태가 아닌 것을 알았습니다. –

1

페이지 수명주기의 어느 시점에서 해당 컨트롤을 만들고 추가하는지 구체적으로 언급하지 않았습니다. 포스트 백이 작동하려면 page_load 이벤트 이전에 모든 생성 (및 배선) 및 '다시 만들기'가 완료되어야합니다.

ID가 동일하면 view_enit에서 수행하고 viewstate 메커니즘이 포스트 백 값을 인계해야합니다. 동적으로 컨트롤을 생성하는 가끔 이벤트가 발생하지 않습니다 제어 그것에 실패하는 경우 http://www.codeproject.com/KB/viewstate/retainingstate.aspx

0

당신은 항상,

희망이 동일한 ID를 넣어해야합니다

나는 비록 여기에 다른 방법을 통해 왔어요 도움.

관련 문제