【发布时间】:2011-06-09 15:12:45
【问题描述】:
我正在为单独的控件中的转发器编写项目模板,然后我正在使用以下代码:
HospitalRepeater.DataSource = LocationsList;
HospitalRepeater.ItemTemplate = Page.LoadTemplate("~/UserControls/HospitalDetails.ascx");
HospitalRepeater.DataBind();
这段代码运行良好,但是现在我们想将自定义事件添加到 HospitalDetails 控件。
我们使用自定义事件参数创建了以下事件:
public class HospitalItemEventArgs : EventArgs
{
public Int32 HospitalID { get; set; }
public HospitalItemEventArgs() { }
public HospitalItemEventArgs(Int32 hID)
{
this.HospitalID = hID;
}
}
public event EventHandler<HospitalItemEventArgs> HospitalAction;
protected virtual void OnHospitalAction(HospitalItemEventArgs e)
{
if (HospitalAction!= null)
this.HospitalAction(this, e);
}
现在有一个问题 - 在将此控件作为模板加载后,我无法从我的代码中访问此自定义事件,因为它返回 System.Web.UI.ITemplate 的对象。 我假设这是我精确控制之上的包装,但这个假设是错误的。
转换为我的控件类型失败并显示以下错误消息:
Unable to cast object of type 'SimpleTemplate' to type 'UserControls.HospitalDetails'.
我尝试过反向操作 - 使用加载控制
Page.LoadControl("~/UserControls/HospitalDetails.ascx");
它返回正确的 HospitalDetails 类型的对象,但它没有实现 ITemplate 接口。
当我尝试这样做时,我收到了错误消息:
Unable to cast object of type 'ASP.usercontrols_hospitaldetails_ascx' to type 'System.Web.UI.ITemplate'.
谁能帮我处理这个演员表,或者找到另一个符合以下要求的解决方案:
- Repeater 应绑定到 HospitalItems 列表以显示详细信息。
- 用于显示详细信息的模板应隐藏其 UI 交互并公开一些简单的事件,例如带有医院 ID 的 HospitalAction。
- 单独的对象必须能够订阅此事件。
【问题讨论】:
-
你想通过在你的项目模板上设置一个事件来完成什么?
-
我想创建在某些用户交互时发生的事件,并将其公开为具有特定 ID 的“HospitalAction”。
标签: asp.net templates event-handling