web-dev-qa-db-fra.com

Comment puis-je parcourir les éléments du modèle d'élément à partir d'un asp: Repeater?

J'ai un répéteur, qui est lié au pré-rendu avec des éléments. Dans le modèle d'élément, chaque ligne comporte une case à cocher. Cela fonctionne bien.

J'essaie de parcourir toutes les cases à cocher du modèle d'élément après sa liaison. Y a-t-il une manière de faire ça?

33
Funky

Il me semble que vous souhaitez utiliser l'événement ItemDataBound.

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

Vous souhaiterez vérifier le ItemType du RepeaterItem afin de ne pas essayer de trouver la case à cocher dans Header/Footer/Seperator/Pager/Edit

Votre événement ressemblerait à quelque chose comme:

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

Cet événement peut être déclenché en ajoutant l'événement dans votre code derrière comme ceci:

rptItems.ItemDataBound += new RepeaterItemEventHandler(rptItems_ItemDataBound);

Ou en l'ajoutant au contrôle sur le client:

onitemdatabound="rptItems_ItemDataBound"

Alternativement, vous pouvez faire comme les autres ont suggéré et parcourir les RepeaterItems, mais vous devez toujours vérifier le type d'élément.

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

Vous voudrez le faire dans la PreRender de page , après que le répéteur ait été lié.

44
Phill

Essaye ça.

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

Quelques pensées différentes me viennent à l'esprit:

  1. Existe-t-il un besoin spécifique de lier ce répéteur dans preRender? Pensez à utiliser la méthode de liaison la plus courante après l'événement▶Load.

  2. Pourquoi voulez-vous rechercher les cases à cocher après que le répéteur a été lié? Pouvez-vous faire tout ce que vous devez faire pendant que il est lié en utilisant cet événement:

    OnItemDataBound="Repeater1_OnItemDataBound"
    
  3. Quoi qu'il en soit, vous pouvez toujours revenir en arrière et regarder à l'intérieur du répéteur en le parcourant simplement. Notez que vous devrez peut-être effectuer une recherche récursive si la case à cocher est imbriquée dans un élément différent à l'intérieur de l'élément répéteur

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