【问题标题】:Repeater template control with custom events带有自定义事件的中继器模板控件
【发布时间】: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


【解决方案1】:

您最好的选择可能是创建一些指定CommandNameCommandArgument 属性的&lt;asp:Button /&gt; 控件。然后,您甚至可以在中继器本身上处理冒泡,询问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 并将该列表存储在数据库中(如果需要持久化)、缓存(如果被多个用户使用)、 session(如果被同一用户的多个页面使用)或 Viewstate(如果被单个页面使用并且列表相对较短)。

【讨论】:

  • 谢谢,这对我有用。但是,它并不能解决常见问题。如果我需要传递超过 1 个参数怎么办?我是否应该通过类似“7;35”的内容并记住 7 是医院 ID 而 35 是医生 ID。如果事件是复杂交互而不是简单点击的结果怎么办?我应该使用 CommandName 创建不可见的 LinkBut​​ton 并触发它的单击以模拟事件吗?我将不胜感激任何使此代码更好的想法。
  • 在上面查看我的更新。用户正在经历哪些复杂事件?这是服务器端代码可以处理的事情吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多