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

时间:2017-05-30 12:52:32

标签: c# asp.net user-controls repeater

我跟着其他一些问题尝试解决这个问题,但它们似乎并不适用于我的情况。 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);

1 个答案:

答案 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中这样做。因为这意味着您每次创建项目时都会加载帖子。这不是你想要的

参考: