2010-07-19 6 views
1

J'ai une application C# WinForm où j'utilise un ListView pour montrer quels fichiers ont été téléchargés dans ma base de données. J'utilise le même code à chaque fois, en appelant LoadFileAttachments() lorsque le formulaire se charge, et à chaque fois que j'actualise la liste, ou ajoutez ou supprimez des pièces jointes supplémentaires de la base de données. (Cette partie fonctionne très bien)Pourquoi cet écart apparaît-il dans ma ListView?

Lorsque j'ai un problème, c'est le côté GUI de ListView. La première fois que LoadFileAttachments() s'exécute et remplit ListView, il existe un espace entre le côté gauche de ListView et les pièces jointes. Lors d'appels ultérieurs, l'écart disparaît.

Comme vous pouvez le voir ci-dessous, les colonnes ne changent pas de largeur, il semble juste y avoir un écart. J'ai essayé de capturer l'événement MouseClick du ListView et en utilisant un ListViewHitTestInfo pour voir ce qui était là, et il montre l'article sur lequel je clique à côté, avec la propriété de "Selected = false". En cliquant sur l'icône ou le texte, l'élément est sélectionné, mais pas dans l'espace.

Quelle est la cause de l'écart?

Screenshot:

Screenshot of the gap/no gap http://img831.imageshack.us/img831/4054/fileattachments.png

Le code que j'appelle chaque fois:

private void LoadFileAttachments() 
{ 
    attachmentListView.Items.Clear(); 
    ImageList iconList = new ImageList(); 
    attachmentListView.LargeImageList = iconList; 
    attachmentListView.SmallImageList = iconList; 
    attachmentListView.StateImageList = iconList; 

    FileAttachmentInfo[] fileAttach = dbAccess.RetrieveAttachedRecords(loadPNGid.Value); 
    foreach (FileAttachmentInfo file in fileAttach) 
    { 
     ListViewItem item = new ListViewItem(file.FileName); 
     item.Tag = file.RowID; 
     iconList.Images.Add(file.FileExtention, ExtractIcons.GetIconImage(file.FileExtention)); 
     item.ImageKey = file.FileExtention; 
     item.SubItems.Add(GetFileTypeDescriptors.GetFileDescriptor(file.FileExtention)); 
     item.SubItems.Add(Conversions.FileSizeToString(file.FileSize)); 
     item.SubItems.Add(file.DateAdded.ToShortDateString()); 
     attachmentListView.Items.Add(item); 
    } 

    if (attachmentListView.Columns.Count == 0) 
    { 
     attachmentListView.Columns.Add("Attachment", 150); 
     attachmentListView.Columns.Add("File type", -2); 
     attachmentListView.Columns.Add("Size", -2); 
     attachmentListView.Columns.Add("Date added", -2); 
    } 
} 

Voici le code dans le fichier concepteur:

// 
// attachmentListView 
// 
this.attachmentListView.AllowColumnReorder = true; 
this.attachmentListView.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
this.attachmentListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; 
this.attachmentListView.Location = new System.Drawing.Point(0, 0); 
this.attachmentListView.MultiSelect = false; 
this.attachmentListView.Name = "attachmentListView"; 
this.attachmentListView.Size = new System.Drawing.Size(440, 301); 
this.attachmentListView.TabIndex = 0; 
this.attachmentListView.TileSize = new System.Drawing.Size(188, 130); 
this.attachmentListView.UseCompatibleStateImageBehavior = false; 
this.attachmentListView.View = System.Windows.Forms.View.Details; 
this.attachmentListView.DoubleClick += new System.EventHandler(this.attachmentListView_DoubleClick); 
this.attachmentListView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.attachmentListView_MouseClick); 
+0

Pourquoi créez-vous un ListViewGroup? La propriété CheckBoxes du LV a-t-elle déjà été activée? –

+0

@Hans Non, je n'ai jamais utilisé les CheckBox avec cette ListView, et ListViewGroup ne devrait pas être là! Je ne suis pas sûr de savoir pourquoi je l'ai mis là (probablement essayer de faire quelque chose de différent à un moment donné), mais je ne l'appelle jamais. Merci d'avoir attrapé cela - enlevé ici et de ma source, même problème. –

+0

Si vous définissez la vue sur, par exemple, LargeIcon et retournez à Details, vous l'écraserez assez solidement. –

Répondre

3

Je crois que le problème est provoqué par votre paramètre de la propriété StateImageList. Selon la documentation ListView.StateImageList, la StateImageList est une liste d'images supplémentaires qui est affichée le long du SmallImageList.

La propriété StateImageList vous permet de spécifier un ImageList qui contient des images à utiliser pour représenter un état spécifique à l'application d'un élément dans un contrôle ListView. Les images d'état sont affichées à gauche d'une icône pour l'élément. Vous pouvez utiliser des images d'état, telles que les cases à cocher cochées et non cochées, pour indiquer les états d'éléments définis par l'application. Les images d'état sont visibles dans toutes les vues du contrôle ListView.

Essayez de le commenter et de voir si cela résout votre problème.

+0

Je ne sais pas pourquoi le problème allait disparaître après avoir exécuté le code deux fois (puisque StateImageList a été construit deux fois) mais cela l'empêche de se produire en premier lieu. –

0

Ne serait-il un différence si vous avez spécifié l'alignement horizontal?

attachmentListView.Columns.Add("Name", -2, HorizontalAlignment.Left); 
+0

Juste essayé, et pas de changement. J'ai fait une erreur dans ma question, cependant - le test de coup quand je clique sur l'écart montre l'article sur lequel je clique. Modification de la question maintenant ... –

1

-t-il un autre si vous définissez explicitement la IndentCount sur le ListViewItem à 0 quand vous les créer?

Nouvelle réponse basée sur une enquête

Je pense que cela a à voir avec le ImageList. Dans le concepteur, je peux obtenir un comportement similaire en ajoutant et en supprimant la liste d'images. Il n'est pas résolu tant que le ListView n'a pas été reconstruit.

Je voudrais ajouter un ImageList au ListView au début, puis simplement effacer et hydrater le même ImageList à plusieurs reprises.

+0

Idée intéressante. Il n'y a pas d'effet quand je le mets explicitement à zéro, mais il y a une différence quand je le mets à 1. Quand je mets 'IndentCount' sur chaque élément à 1, la première fois que la liste se charge, J'ai mis le retrait à 2. Après un rafraîchissement, il se déplace à l'endroit où Indent = 1 serait, ce qui ressemble à la liste quand il se charge. C'est comme s'il y avait un retrait sur les éléments de la liste! –

+0

Pouvons-nous voir les paramètres initiaux de ListView? Où attachmentListView est instancié ... (ne pensant pas que cela fera une différence, mais juste au cas où .. –

+0

l'a ajouté au bas de mon article –

Questions connexes