2011-09-16 2 views
1

J'essaie de créer une liste de contrôles. Pour cela, j'ai utilisé un panneau de disposition de flux et un élément personnalisé. Après avoir lu un fichier XML, je remplis le panneau de disposition de flux avec mes éléments. Pour un petit nombre d'éléments, tout semble correct, mais pour un nombre comme 371 d'éléments dans le panneau de disposition de flux quelque chose se trompe. Au bas du panneau de disposition de flux, 95 éléments sont manquants et les coutures doivent se chevaucher. L'espace situé pour ces articles, je pense, est encore créé. Je joins un écran avec l'effet produit. Les contrôles sont créés dans un tableau, puis j'itéère ce tableau pour ajouter les contrôles au panneau de disposition de flux.Problèmes de panneau de configuration de flux

http://img510.imageshack.us/img510/3201/screen2011916213527199.jpg

Merci.

LE:

public delegate void AddHistoryItemDelegate(Control itm); 
     public void AddHistoryItem(Control itm) 
     { 
      if (InvokeRequired) 
      { 
       Invoke(new AddHistoryItemDelegate(AddHistoryItem), new object[] { itm }); 
      } 
      else 
      { 
       flowLayoutPanel1.Controls.Add(itm); 
      } 
     } 
foreach (Control c in histroryItems) 
      { 
       controls++; 
       backgroundWorkerLoadHistory.ReportProgress(controls); 
       //flowLayoutPanel1.Controls.Add(c); 
       AddHistoryItem(c); 
      } 

Le délégué est là parce que tout cela se déroule dans un thread séparé. histroryItems est une liste de contrôles. LE: Si ça compte, j'ai remarqué que si je retire un élément de la liste, après le chargement de la liste, il est arrangé. Essayer un petit hack pour voir si ajouter et supprimer un contrôle à la fin du thread, n'a aucun effet.

+0

C# n'a pas FlowPanel. Ou tout Conbtrols. –

+0

concerne FlowLayoutPanel dans Winforms. Désolé pour les balises manquantes. – andySF

Répondre

3

Vous pouvez essayer ceci:

 this.flowLayoutPanel1.SuspendLayout(); 

avant d'ajouter des contrôles et:

 this.flowLayoutPanel1.ResumeLayout(); 

après l'ajout de contrôles. Peut-être que les éléments suivants devraient être effectués consécutivement:

 this.flowLayoutPanel1.PerformLayout(); 

et/ou:

 this.flowLayoutPanel1.Refresh(); 
1

Je trouve que je devais faire:

private void flpChoices_Scroll(object sender, ScrollEventArgs e) 
{ 
    Control c=flpChoices.GetChildAtPoint(new Point(10, 10), GetChildAtPointSkip.None); 
    if (c == null) flpChoices.PerformLayout(); 
} 

Où est ma flpChoicesFlowLayout Panel. Maintenant, je ne pense pas que l'événement de défilement est déclenché sur le mouvement de la molette de la souris, donc je ne sais pas quoi faire à ce sujet.

EDIT: Il y a un caché (pas dans la fenêtre de la propriété), même pour la roue de défilement:

void flpChoices_MouseWheel(object sender, MouseEventArgs e) 
{ 
    Control c=flpChoices.GetChildAtPoint(new Point(10, 10), GetChildAtPointSkip.None); 
    if (c == null) flpChoices.PerformLayout(); 

} 
+0

Merci pour l'info. Je vais essayer de voir comment cela fonctionne. Cependant, j'ai changé le design et j'utilise un bouton "Charger plus ..." :) – andySF

+0

Est-ce que cela fonctionne? Avez-vous un exemple? Je ne suis pas vraiment content de la façon hacky de faire ça. – Plater

Questions connexes