2009-02-26 21 views
0

J'utilise le contrôle winare datarepeater de vb.net powerpack.Itérer via DataRepeater (VB.Net PowerPack)

Tous les éléments du répéteur sont en lecture seule sauf pour une colonne de case à cocher.

Je souhaite parcourir les éléments et rechercher les cases cochées.

Je ne trouve pas de collection de données datearpeater sur le contrôle et l'aide est rare.

Merci pour l'aide. Pourquoi ne pas simplement vérifier la source de données du datarepeater?

Répondre

0

Vous pouvez parcourir la liste des contrôles (généré à partir du modèle)

  1. Renommer votre case à cocher dans le DataRepeater à « checkBoxUnbound »

  2. Utilisez le code ci-dessous

    private void button3_Click(object sender, EventArgs e) 
    { 
        int i = 0; 
        CheckBox unboundCheckBox; 
        foreach (Control c in dataRepeater1.Controls) 
        { 
         unboundCheckBox = c.Controls["checkBoxUnbound"] as CheckBox; 
         if (unboundCheckBox != null && unboundCheckBox.Checked) 
         { 
          i++; 
         } 
        } 
    
        Console.WriteLine("DEBUG: checked found: " + i); 
    
    } 
    
+0

J'ai testé cela et cela ne fonctionnera pas si vous avez plus d'articles que ceux qui correspondent à mon contrôle. Cela signifie que les contrôles qui ne sont visibles que par défilement n'apparaîtront pas dans 'dataRepeater1.Controls'. @ peter-gfader, des idées? – Joel

+0

Hmm ... Pas pour le moment. Peut-être existe-t-il une autre façon d'itérer sur tous les contrôles. Je m'attendais à ce que ". Contrôles" –

+0

Un possible contourner: une 'List ', 'Collection' ou quelque chose de même sorte garde une trace des changements possibles (tels que la sélection de ligne - Je supporte les résultats de filtrage, donc cette stratégie fonctionne pour moi) et j'ai hadnle des événements tels que 'DataRepeater_ItemClick' ou' DataRepeater_DrawItem' pour afficher/mettre à jour correctement les éléments. En itérant, je itère sur la liste/collection au lieu de 'DataRepeater' lui-même. Pas une solution élégante, mais ça marche. – Joel

0

E.g. J'ai un DataRepeater lié à un BindingSource pour les personnes bouton Voir gestionnaire

private void Form1_Load(object sender, EventArgs e) 
    { 
     List<Person> persons = new List<Person>(); 
     persons.Add(new Person { Name = "Peter", IsLocal = true }); 
     persons.Add(new Person { Name = "Sepp", IsLocal = false }); 
     persons.Add(new Person { Name = "Franz", IsLocal = false }); 

     personBindingSource.DataSource = persons; 
    } 


    private void buttonCountCheckBox_Click(object sender, EventArgs e) 
    { 
     int i = 0; 

     foreach (Person singlePerson in personBindingSource) 
     { 
      if (singlePerson.IsLocal) 
      { 
       i++; 
      } 

     } 
     Console.WriteLine("DEBUG: checked found: " + i); 
    } 
+0

La case à cocher n'est pas liée et ne fait pas partie de la source de données. C'est la première colonne et est utilisée pour vérifier une action par ex. supprimer tous les sélectionnés. –

+0

voir autre réponse –

2

a demandé à ce il y a un certain temps, mais juste au cas où quelqu'un d'autre est à la recherche d'une réponse:

for (int i = 0; i < this.dataRepeater1.ItemCount; i++) 
{ 
    this.dataRepeater1.CurrentItemIndex = i; 

    CheckBox checkBox = (CheckBox) 
       this.dataRepeater1.CurrentItem.Controls["controlName"]; 
    bool isChecked = checkBox.Checked; 
} 

Cette approche rend beaucoup plus facile de traiter/lire tous les contrôles connexes sur le même élément de répéteur.