동적으로 생성 된 LinkButton
에 페이지의 메서드를 바인딩하는 메서드가 있습니다.이벤트에 대리자를 동적으로 바인딩
protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance,
string methodName, string eventName)
{
Delegate d = null;
EventInfo ei = controlInstance.GetType().GetEvent(eventName);
Type tDelegate = ei.EventHandlerType;
MethodInfo method = page.GetType().BaseType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
d = Delegate.CreateDelegate(tDelegate, page, method);
else {
FieldInfo field = page.GetType().BaseType.GetField(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
d = field.GetValue(page) as Delegate;
}
}
MethodInfo addHandler = ei.GetAddMethod();
object[] addHandlerArgs = { d };
addHandler.Invoke(controlInstance, addHandlerArgs);
}
이는 해당 페이지 내부의 메소드에 적용됩니다. 내가 추가하고 싶은 것은 사용자 컨트롤 내부의 메소드를 지원하는 것입니다. 그래서 페이지 코드 숨김 뒤에 delegate
을 만들고 런타임에 사용자 정의 컨트롤 메서드를 할당합니다.
내가 만들고과 같이 대리자를 할당 : 다음
protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
과 : 코드는 방법을 찾으려고
이 하나가 발견되지 않을 때 시도
PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage;
을위한 필드를 찾을 수를 대리자를 찾아 올바른 컨트롤을 가리키는 올바른 컨트롤을 대상으로 사용합니다.
문제 addHandler.Invoke(controlInstance, addHandlerArgs);
도달했을 때, 그것은 '은 System.EventHandler를'형태로 변환 할 수없는 예외로 형 'SomePage + PrintPageMethod'의
개체가 발생한다는 것이다.
내가 뭘 잘못하고 있는지 알 수 없습니다.
protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
사용 : 대신
전체 사용자 정의 컨트롤 표시 (이벤트 관련 사항) – jgauffin
@jgauffin - usercontrol 코드를 추가했지만 대리자가 함수에 대한 포인터이기 때문에 함수 자체를 표시하는 관련성을 알 수 없습니다. 예외는 함수를 대리자에 할당하는 것이 아니라 대리자를 이벤트 hanlder에 할당하는 것과 관련이 있습니다. –