使用自定义事件的Repeater模板控件

时间:2011-06-09 15:12:45

标签: asp.net templates event-handling

我正在单独控制中为转发器编写项目模板,然后我使用以下代码:

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接口。

Whan我试图这样做我收到了错误消息:

Unable to cast object of type 'ASP.usercontrols_hospitaldetails_ascx' to type 'System.Web.UI.ITemplate'.

任何人都可以帮助我处理此演员表,或者找到符合以下要求的其他解决方案:

  • 应将Repeater绑定到HospitalItems列表以显示详细信息。
  • 用于显示详细信息的模板应该隐藏它的UI交互,并公开一些简单的事件,例如带有医院ID的HospitalAction。
  • 单独的对象必须具有订阅此事件的能力。

1 个答案:

答案 0 :(得分:0)

您最好的选择可能是创建一些指定<asp:Button />CommandName属性的CommandArgument个控件。然后,即使在转发器本身上,您也可以处理冒泡,询问CommandNameCommandArgument的参数。

我没有使用单独的控件作为模板,但同样的事情可以像这样完成。

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
        <asp:Button ID="SaveButton"
                    CommandName="Save" 
                    CommandArgument="{insert hospitol ID here}" 
                    Text="Save"
                    runat="server" />
    </ItemTemplate>
</asp:Repeater>

    void myRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Save")
        {
            int id = int.Parse(e.CommandArgument.ToString());
            //Do some saving
        }
    }

<强>更新

按钮的CommandArgumentCommandName属性的目的是允许您为用户提供单独的操作来处理数据绑定ui内容。 CommandArgument属性允许您返回数据以检索事件的相关信息。我从未试图在此属性中放置多个值,但我没有看到为什么它不起作用的原因。

另一种选择是创建一个包含HospitalID和DoctorID关联的单独列表,为每个关联创建一个唯一ID,并将该列表存储在数据库中(如果需要保留它),缓存(如果多个用户使用),会话(如果由同一用户使用多个页面)或Viewstate(如果由单个页面使用且列表相对较短)。