2017-05-30 15 views
2

内に存在するユーザーコントロールから親ページ内のメソッドを呼び出すと、私はこの問題を解決しようとする他の質問の数を踏襲したが、彼らは私の場合には適用されていないようです。 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

あなたは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); 
    } 
} 

そして、実際にはイベントをフックする必要はありません。したがって、次のようになります。

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); 
    } 
} 

In ItemDataBoundでは、まだ投稿を読み込む必要があります。私はItemCreatedでそれを行うことをお勧めしません。これは、アイテムを作成するたびに投稿を読み込むことを意味するためです。

+0

それは動作します:あなたが

リファレンスを望むものはどのではありません!迅速な返信をありがとう! – Osprey

+0

@Osprey:問題ありません。喜んで助ける – Arion