从驻留在转发器控件内的用户控件调用父页面中的方法

Calling a method in parent page from a user control residing inside a repeater control

我按照其他一些问题尝试解决这个问题,但它们似乎不适用于我的情况。 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) 似乎总是 return false,因此 UserControlButtonClicked(this, EventArgs.Empty); 永远不会被执行。

您需要将事件挂接到 OnItemCreated 上。否则,如果您 post 该页面将会消失。所以我希望它看起来像这样:

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 中您仍然需要加载 post。我不建议在 ItemCreated 中这样做。因为这意味着您将在每次创建项目时加载 post。这不是你想要的

参考: