Решение № 1: Создание общего интерфейса.
// IParentControlUpdater.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
interface IParentControlUpdater {
event EventHandler<EventArgs> UpdateParent;
}
}
// DynamicUserControl.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControl : System.Web.UI.UserControl, IParentControlUpdater {
protected void Page_Load(object sender, EventArgs e) { }
#region IParentControlUpdater Members
public event EventHandler<EventArgs> UpdateParent;
#endregion
}
}
// Default.aspx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) { }
private void LoadMyUserControl(string controlName) {
UserControl control = (UserControl)LoadControl(controlName);
// Do some stuff
((IParentControlUpdater)control).UpdateParent += new EventHandler<EventArgs>(control_UpdateParent);
}
private void control_UpdateParent(object sender, EventArgs e) {
throw new NotImplementedException();
}
}
}
Решение № 2: Создание базового класса.Создайте базовый класс пользовательского элемента управления (например, DynamicUserControlBase).
// DynamicUserControlBase.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControlBase : System.Web.UI.UserControl {
protected void Page_Load(object sender, EventArgs e) { }
// Base event
public event System.EventHandler<System.EventArgs> UpdateParent;
}
}
Затем в своем пользовательском элементе управления вы хотите динамически создать и подписать событие updateParent:
// DynamicUserControl.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControl : DynamicUserControlBase {
protected void Page_Load(object sender, EventArgs e) { }
}
}
Обратите внимание, какон наследуется от DynamicUserControlBase.Теперь для вашего метода LoadMyUserControl:
private void LoadMyUserControl(string controlName) {
DynamicUserControlBase control = (DynamicUserControlBase)LoadControl(controlName);
// Do some stuff
control.UpdateParent += new EventHandler<EventArgs>(HandledEvent);
}
private void HandledEvent(object sender, EventArgs e) {
throw new NotImplementedException();
}
Однако, если вы работаете только с одним типом элемента управления, вы можете так же легко изменить бокс на LoadControl на:
WebUserControl1 control = (WebUserControl1)LoadControl(controlName); // example
Нокажется, что вы, возможно, смотрите на загрузку множества различных типов пользовательских элементов управления, поэтому первое решение должно работать нормально.
Что касается вашей озабоченности с помощью Reflection, попробуйте следующее:
Type type = MyControl.GetType();
EventInfo eventInfo = type.GetEvent("UpdateParent");
EventHandler handler = new EventHandler(HandledEvent);
eventInfo.AddEventHandler(MyControl, handler);