2011-12-20 10 views
0

私はこのように、リピーターを持っており、それにオブジェクトのリストをバインド:リピーターのボタンクリックイベントハンドラーでバインドされたオブジェクトを取得する方法は?

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) { 
    if (e.CommandName == "Edit") { 
     // I need to get my listItem.Id here 
    } 
} 

それは次のようになります。私は、このハンドラによって処理されたリンクボタンを持つリピータインサイド

List<MyClass> myList = //.... 
MyRepeater.DataSource = myList; 
MyRepeater.DataBind(); 

簡単ですが、私はそれを行う方法を見つけることができません。

ありがとうございました。

答えて

4

クリックされた実際のリンクボタンが既にobject sourceパラメータでこのメソッドに渡されている場合は、それを適切にキャストします。

LinkButton lb = source as LinkButton; 

あなたがリピーターにありますいくつかの他のコントロールをしたい場合は、

Button randomButton = e.Item.FindControl("buttonId") as Button; 

EDIT

あなたは、この行がにバインドされたオブジェクトからプロパティをしたい場合は、これを使用することができますやらなければならない苦痛で、それは醜いでしょう。リピータがSessionまたはViewStateのいずれかのポストバックにバインドされているDataSourceを永続化する必要があります。最も簡単な方法があることが

e.Item.ItemIndex 

注:あなたはあなたがで得ることができ、クリックされたreeaterの行のインデックスとそのインデックスを一致させることにより、ソース内の適切なオブジェクトにアクセスすることができ、それを行うたら、リピーターのどこかにこの値を保存してください。

+0

申し訳ありませんが、私は明確ではなかったかもしれ、私が取得する必要がありますこのリピータ項目にバインドされているオブジェクトのプロパティ。 – Burjua

+0

@ Burjua、私の答えに記載されているように、これはできません。コントロールにデータを保存し、FindControlアプローチを使用する必要があります。 –

+0

@Burjua - 私の編集を参照してください –

1

これはできません。元のデータバインドされたオブジェクトは、ポストバック間でASP.Netによって保持されません。リピーター内のコントロールに保存したいデータを保存する必要があります。その後、EventArgsを介してコントロールにアクセスできます。

e.Item.FindControl("myControl"); 
3

ほとんどの場合、バインドされたオブジェクトをストレージ/キャッシュ/ etcからフェッチするのは簡単です。あなたがIDを持っているならば。あなたはあなたの質問で「I need to get my listItem.Id here」と言っていたので、オブジェクト自体を再フェッチする気にはならず、リピータから識別子だけを取得する方法を探していると思います。

ジャストボタンを示すようなコマンド引数与える:あなたは間違いなく、あなたの質問に言ったように続いて

<asp:LinkButton runat="server" ID="lnkEdit" CommandName="Edit" 
    CommandArgument='<%# Eval("ID") %>'>Edit</asp:LinkButton> 

protected void Button_ItemCommand(object source, RepeaterCommandEventArgs e) { 
    if (e.CommandName == "Edit") { 
    // I need to get my listItem.Id here 
    RenderEditDialog(FetchFromStorage(e.CommandArgument.ToString()); 
    } 
} 
関連する問題