기본적으로 페이지로드시 페이지에 동적으로 자리 표시자를 추가했습니다.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을 사용하여 불가능한 것을 요구할 수 있습니다.
실제로 처리기를 연결하는 코드를 더 게시 할 수 있습니까? – user134706
나는 거기에 이벤트 처리기를 저장하여 메모리 누출을 확신한다.) – user134706