我正在单独控制中为转发器编写项目模板,然后我使用以下代码:
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'.
任何人都可以帮助我处理此演员表,或者找到符合以下要求的其他解决方案:
答案 0 :(得分:0)
您最好的选择可能是创建一些指定<asp:Button />
和CommandName
属性的CommandArgument
个控件。然后,即使在转发器本身上,您也可以处理冒泡,询问CommandName
和CommandArgument
的参数。
我没有使用单独的控件作为模板,但同样的事情可以像这样完成。
<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
}
}
<强>更新强>
按钮的CommandArgument
和CommandName
属性的目的是允许您为用户提供单独的操作来处理数据绑定ui内容。 CommandArgument
属性允许您返回数据以检索事件的相关信息。我从未试图在此属性中放置多个值,但我没有看到为什么它不起作用的原因。
另一种选择是创建一个包含HospitalID和DoctorID关联的单独列表,为每个关联创建一个唯一ID,并将该列表存储在数据库中(如果需要保留它),缓存(如果多个用户使用),会话(如果由同一用户使用多个页面)或Viewstate(如果由单个页面使用且列表相对较短)。