web-dev-qa-db-ja.com

asp:Repeaterからアイテムテンプレートのアイテムをループするにはどうすればよいですか?

リピーターがあり、これはpreRenderにアイテムとバインドされています。アイテムテンプレートでは、各行にチェックボックスがあります。これは正常に機能します。

バインドされたアイテムテンプレートのすべてのチェックボックスをループしようとしています。これを行う方法はありますか?

33
Funky

ItemDataBoundイベントを使用したいようです。

http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

RepeaterItemのItemTypeを確認して、Header/Footer/Seperator/Pager/Editでチェックボックスを見つけようとしないようにします。

あなたのイベントは次のようなものになります。

void rptItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var checkBox = (CheckBox) e.Item.FindControl("ckbActive");

        //Do something with your checkbox...
        checkBox.Checked = true;
    }
}

このイベントは、次のようにコードビハインドにイベントを追加することで発生できます。

rptItems.ItemDataBound += new RepeaterItemEventHandler(rptItems_ItemDataBound);

または、クライアントのコントロールに追加することにより:

onitemdatabound="rptItems_ItemDataBound"

あるいは、他の人が提案したように、RepeaterItemsを反復処理することもできますが、itemtypeを確認する必要があります。

foreach (RepeaterItem item in rptItems.Items)
{
    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
    {
        var checkBox = (CheckBox)item.FindControl("ckbActive");

        //Do something with your checkbox...
        checkBox.Checked = true;
    }
}

リピーターがバインドされた後、ページのPreRenderでそれを行いたいでしょう。

44
Phill

これを試して。

for each (RepeaterItem ri in Repeater1.Items)
{
     CheckBox CheckBoxInRepeater = ri.FindControl("CheckBox1") as CheckBox;

    //do something with the checkbox
}
16
CYMR0
for (int item = 0; item < Repeater.Items.Count; item++)
{
   CheckBox box = Repeater.Items[item].FindControl("CheckBoxID") as CheckBox;
   if (box.Checked)
   {
      DoStuff();
   }
   else
   {
      DoOtherStuff();
   }
}
3
carlbenson

いくつかの異なる考えが思い浮かびます:

  1. PreRenderでこのリピーターをバインドする特定のニーズはありますか? Page_Loadイベントの後に、より一般的なバインド方法を使用することを検討してください。

  2. リピーターがバインドされた後、なぜチェックボックスを探したいのですか?必要なことは何でもできますかwhileこのイベントを使用してバインドされています:

    OnItemDataBound="Repeater1_OnItemDataBound"
    
  3. いずれにせよ、リピータを反復するだけで、いつでもリピーターの内部に戻ることができます。チェックボックスがリピーター項目内の別の要素にネストされている場合、再帰検索を実行する必要がある場合があることに注意してください

    for each (RepeaterItem r in Repeater1.Items) {
        CheckBox c = r.FindControl("CheckBox1") as CheckBox;
        //DO whatever
    }
    
1
spiderman