Affichage "Live "dans ListView

Affichage "Live "dans ListView - VB/VBA/VBS - Programmation

Marsh Posté le 15-08-2009 à 18:01:07    

Bonjour
 
Je m'essaye à VB 2008 (Express Edition).
 
Dans le programme, je lis un fichier .csv pour remplir un ListView.
Je n'ai aucun problème pour lire le fichier et injecter son contenu dans la ListView.
 
Le fichier contenant plus de 2000 lignes, lorsque je lance l'opération, on dirait que le programme ne fait rien,  
et tout d'un coup, le contenu du ListView s'affiche.
 
Ce que j'aimerais, c'est que l'affichage du ListView suive la progression du travail en affichant toujours la dernière ligne ajoutée,  
de façon à ne pas avoir l'impression que le programme est planté.
Un peu comme si j'appuyais sur la touche "Fin" après l'ajout de chaque lignes.
 
J'ai essayé d'utiliser Lst_Result.Refresh() dans la boucle après ajout d'une ligne,
ca donne moins l'impression que le programme est planté, mais c'est pas encore cela.
Ca donne un effet trop flash; et de plus la ListView reste sur les premiers.
 
Comment puis je faire pour que le ListView affiche toujours la dernière ligne ajoutée ?
 
Merci d'avance

Reply

Marsh Posté le 15-08-2009 à 18:01:07   

Reply

Marsh Posté le 17-08-2009 à 19:59:27    

Salut
 
Il n'y a personne qui peut m'aider ou est ce que je ne suis pas clair dans mes explications?
 

Reply

Marsh Posté le 20-08-2009 à 21:57:44    

Salut
J'ai fini par utiliser "Lst_Result.Items(Ligne).EnsureVisible()" et "Lst_Result.Refresh()"
 
Je vois les données lues dans le fichier s'ajouter dans le ListView.  
Mais sur la fin je recois un message.  
 
"
ContextSwitchDeadlock a été détecté
Message: Le CLR n'a pas pu effectuer de transition du contexte COM 0x20b2ce0 au contexte COM 0x20b2f30 pendant 60 secondes.  
Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue
sans pompage des messages Windows.  
Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire.  
Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles)  
et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
"
 
Ce n'est pas vraiment une erreur, les données du fichier se trouvent bien toutes dans le ListView.
Mais j'aimerais comprendre le message, comment fait on pour "pomper les messages Windows" ?
Enfin, plutôt savoir quoi faire pour qu'il ne s'affiche plus ?
 

Code :
  1. Dim Ligne As Integer = 0
  2. If Btn_Fichier.Enabled() = True Then
  3.    Txt_FichiersResultat.Text = "Veuillez patientez. Sélection et chargement en cours ..."
  4.    OpenFileDialog1.ShowDialog()
  5.    Txt_FichiersResultat.Text = OpenFileDialog1.FileName
  6.    Using MonLecteur As New Microsoft.VisualBasic.FileIO.TextFieldParser(Txt_FichiersResultat.Text)
  7.       MonLecteur.TextFieldType = FileIO.FieldType.Delimited
  8.       MonLecteur.SetDelimiters(";" )
  9.       Dim currentRow As String()
  10.       Try
  11.          currentRow = MonLecteur.ReadFields()
  12.       Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
  13.          MsgBox("Line " & ex.Message & _
  14.          "is not valid and will be skipped." )
  15.       End Try
  16.       While Not MonLecteur.EndOfData
  17.          currentRow = MonLecteur.ReadFields()
  18.          Lst_Result.Items.Add(currentRow(0))
  19.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(1))
  20.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(2))
  21.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(3))
  22.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(4))
  23.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(5))
  24.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(6))
  25.          Lst_Result.Items(Ligne).SubItems.Add(currentRow(7))
  26.          Lst_Result.Items(Ligne).EnsureVisible()
  27.          Lst_Result.Refresh()
  28.          Ligne = Ligne + 1
  29.       End While
  30.       Btn_Fichier.Enabled() = False
  31.       Lst_Result.Focus()
  32.       Lst_Result.Items(Ligne - 1).Selected = True
  33.    End Using
  34. Else
  35.    MsgBox("Le fichier des tirages a déjà été pris en compte" )
  36. End If


 
 
 

Reply

Marsh Posté le 23-08-2009 à 11:18:19    

Pas de solution à ton problème, mais peut être une piste pour le contourner : mettre un message (acquisition des données, ceci peut prendre plusieurs minutes) en remplaçant le curseur par le sablier. Eventuellement, gérer un évènement "Annuler" ?


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 23-08-2009 à 13:40:45    

Merci pour ta solution, c'est une bonne idée.
je vais voir comment faire.
Afficher un message, c'est compliqué; gérer l'annulation me semble un peu plus compliqué
Ca me permettra d'en apprendre plus en VB.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed