2010-07-14 7 views
4

Est-il possible de créer une liste listant un tas de contrôles personnalisés? Je suppose que vous devrez peut-être invoquer une sorte de dessin personnalisé des objets enfants, mais je ne sais pas comment faire cela. Quelqu'un peut-il nous éclairer là-dessus?WinForms listbox contenant des contrôles personnalisés?

+2

Utilisez-vous Winforms, WPF ou autre chose? –

+2

Pour faire ce genre de chose, j'ajoute un * FlowLayoutPanel * puis j'ajoute mes contrôles de façon fantaisiste. – Luiscencio

+0

Just WinForms ... – MarkP

Répondre

6

Sa barre de défilement ne peut pas faire défiler les contrôles. C'est en général quelque chose que vous voulez éviter, en mettant beaucoup de contrôles dans, disons, un Panel dont la propriété AutoScroll est True rendra votre interface utilisateur inerte. Les contrôles sont des objets coûteux.

Jetez un coup d'œil à l'événement ListBox.DrawItem. Vous pouvez dessiner votre propre objet et le rendre exactement comme vous le souhaitez avec les méthodes de la classe Graphics. Et c'est très bon marché. Il y a un très bon exemple dans le MSDN Library article pour l'événement.

0

C'est assez facile avec WPF, il suffit d'utiliser la composition de base. Dans un monde WinForms, vous devrez probablement personnaliser le conteneur. Un ListBox n'est pas conçu pour être un contrôle de conteneur.

+0

Je n'ai jamais utilisé WPF, donc je m'en tiens à WinForms. Donc, le conteneur et les articles devraient être un contrôle personnalisé. – MarkP

+0

Le conteneur serait, les éléments pourraient ne pas avoir à être. Votre conteneur personnalisé contiendrait probablement une collection d'objets 'Control'. –

2

Je l'ai fait avant de ne pas utiliser un FlowLayoutPanel, mais juste un panneau normal avec des contrôles ancrés en haut. Vous pouvez ajouter une barre de défilement, etc.

Cela fonctionne très bien pour quelques contrôles. Plus que quelques-uns, et il commence à vraiment ralentir. Si vous avez le temps, je voudrais dessiner un faux contrôle à sa place, comme dans Hans Passant's answer, puis lorsque l'utilisateur clique sur l'un des éléments, remplacez-le par un contrôle réel qui ressemble exactement le même. Lorsque cet élément perd le focus, disposez-le et modifiez la liste sous-jacente.

+0

vous avez volé mon commentaire et l'a transformé en une réponse ... génial !!! – Luiscencio

+1

@Luiscencio - C'était plus une réponse à votre commentaire, en fait. Remarquez que j'ai dit que je n'utilisais pas un FlowLayoutPanel, mais un simple Panel. La raison en est que si vous voulez simuler une zone de liste, ils sont tous disposés verticalement, et non dans la disposition "flow" du FlowLayoutPanel. (D'ailleurs, si vous vouliez que votre commentaire soit une réponse, vous devriez l'avoir posté comme réponse.) – dlras2

+2

Je t'aime toujours – Luiscencio

1

Peut-être que c'est ce que vous cherchez: Flexible List Control

j'ai écrit cet article il y a quelque temps.

0
private void OnDrawItem(object sender, DrawItemEventArgs e) 
    { 
     Rectangle rect = e.Bounds; 
     rect.Offset(0, -rect.Top); 
     using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) 
     { 
      Control control = (Control)listBox.Items[e.Index]; 
      control.DrawToBitmap(bitmap, rect); 
      rect = e.Bounds; 
      e.Graphics.DrawImage(bitmap, e.Bounds); 
     } 
    } 
Questions connexes