我跟着其他一些问题尝试解决这个问题,但它们似乎并不适用于我的情况。 This is an example
就我而言,在转发器中多次加载了一个用户控件实例,我怀疑这与我遇到的问题有关。
我使用此方法将事件附加到用户控件的每个实例。
protected void rptPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView MyRow = (DataRowView)e.Item.DataItem;
Post MyPost = (Post)e.Item.FindControl("Post");
MyPost.UserControlButtonClicked += new EventHandler(MyPost_UserControlButtonClicked);
MyPost.LoadPost(MyRow);
}
}
private void MyPost_UserControlButtonClicked(object sender, EventArgs e)
{
// reload repeater items
}
在我后面的用户控制代码里面放了这段代码:
public event EventHandler UserControlButtonClicked;
private void OnUserControlButtonClick()
{
if (UserControlButtonClicked != null)
{
UserControlButtonClicked(this, EventArgs.Empty);
}
}
在用户控件内部的按钮(应该触发页面方法)我把它放在:
protected void lnkDelete_Click(object sender, EventArgs e)
{
// Code to delete record //
OnUserControlButtonClick();
}
问题似乎是if (UserControlButtonClicked != null)
似乎总是返回false,因此永远不会执行UserControlButtonClicked(this, EventArgs.Empty);
。
答案 0 :(得分:1)
您需要在OnItemCreated上挂起事件。如果您发布页面,其他人将会消失。所以我希望它看起来像这样:
protected void rptPosts_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Post MyPost = (Post)e.Item.FindControl("Post");
MyPost.UserControlButtonClicked += new EventHandler(MyPost_UserControlButtonClicked);
}
}
然后在ItemDataBound中你真的不需要挂起事件。所以它看起来像这样:
protected void rptPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView MyRow = (DataRowView)e.Item.DataItem;
Post MyPost = (Post)e.Item.FindControl("Post");
MyPost.LoadPost(MyRow);
}
}
在ItemDataBound中,你仍然需要加载帖子。我不建议在ItemCreated中这样做。因为这意味着您每次创建项目时都会加载帖子。这不是你想要的
参考: