.NET Listview d'Actualisation
J'ai le code suivant, qui prend essentiellement en valeurs à partir d'une base de données et de remplir une listview.
using (IDataReader reader = cmd.ExecuteReader())
{
lvwMyList.Items.Clear();
while (reader.Read())
{
ListViewItem lvi = lvwMyList.Items.Add(reader["Value1"].ToString());
lvi.SubItems.Add(reader["Value2"].ToString());
}
}
Le problème que j'ai c'est que c'est exécutée de façon répétée à de courts intervalles (chaque seconde) et les résultats dans les éléments de la liste continuellement en train de disparaître et réapparaitre. Est-il un moyen d'arrêter la liste d'actualiser jusqu'à ce qu'il fait avec les mises à jour? Quelque chose comme ci-dessous:
using (IDataReader reader = cmd.ExecuteReader())
{
lvwMyList.Items.Freeze(); //Stop the listview updating
lvwMyList.Items.Clear();
while (reader.Read())
{
ListViewItem lvi = lvwMyList.Items.Add(reader["Value1"].ToString());
lvi.SubItems.Add(reader["Value2"].ToString());
}
lvwMyList.Items.UnFreeze(); //Refresh the listview
}
Gel signifie quelque chose d'autre: cela signifie que l'objet (dans ce cas, une collection d'éléments) ne change pas alors que c'est gelé. Dans ce cas, vous êtes alors immédiatement le modifier!
Gel était juste un terme que j'ai utilisé pour expliquer mon exigence
Gel était juste un terme que j'ai utilisé pour expliquer mon exigence
OriginalL'auteur Paul Michaels | 2010-07-21
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
Assurez-vous que vous appelez
lvwMyList.Items.Clear()
aprèsBeginUpdate
si vous voulez effacer de la liste avant de le remplir.Cette vraiment fait ce que j'ai demandé. Seul problème, c'est qu'il a pratiquement les verrous de la forme 🙂
Ayant clairement à l'intérieur de beginupdate devrait l'empêcher de clignoter. La forme n'est pas verrouillé par beginupdate mais par votre code qui ajoute de nouveaux éléments. Essayez de récupérer tous les éléments de la Db avant de faire la mise à jour.
Envisagez de placer EndUpdate dans un bloc finally.
fixe.
OriginalL'auteur jgauffin
C'est ma première publication sur StackOverflow, donc excusez le désordre de formatage de code ci-dessous.
Pour éviter le blocage de la forme, tandis que la mise à jour de la liste, vous pouvez utiliser la méthode ci-dessous que j'ai écrit pour résoudre ce problème.
Remarque: Cette méthode ne doit pas être utilisé si vous vous attendez à remplir la liste de plus de 20 000 articles. Si vous avez besoin d'ajouter plus de 20k des éléments à la Liste, considère que l'exécution de la ListView en mode virtuel.
Vous n'avez pas à fournir une IProgress objet, il suffit d'utiliser la valeur null et la méthode fonctionnera tout aussi bien.
Ci-dessous est un exemple d'utilisation de la méthode.
Tout d'abord, définir une classe qui contient les données pour le ListViewItem.
Ensuite, créez une méthode qui renvoie à vos éléments de données. Cette méthode offre la possibilité d'interroger une base de données, appeler un service web API, ou que ce soit, tant qu'il renvoie un IEnumerable de votre type de classe.
Enfin, sur la forme où votre ListView réside, vous pouvez remplir la Liste. Pour les besoins de la démonstration, je suis en utilisant l'événement Load du formulaire à remplir la liste. Plus que probablement, vous aurez envie de le faire ailleurs que sur la forme.
J'ai inclus la fonction qui génère un ListViewItem à partir d'une instance de ma classe, TestListViewItemClass. Dans un scénario de production, vous aurez probablement envie de définir la fonction d'ailleurs.
Dans l'exemple ci-dessus, j'ai créé un IProgress objet dans la forme du constructeur comme suit:
J'ai utilisé cette méthode de remplir une ListView à de nombreuses reprises dans les projets où nous avons été le remplissage jusqu'à 12 000 éléments dans la liste, et il est extrêmement rapide. La chose principale est que vous devez avoir votre objet entièrement construit à partir de la base de données avant même de toucher la liste des mises à jour.
J'espère que cela est utile.
J'ai inclus ci-dessous une version asynchrone de la méthode, qui appelle la méthode affiche dans le haut de ce post.
OriginalL'auteur Alex
Vous pouvez également essayer de définir le visible ou permis de propriétés à faux lors de la mise à jour et voir si vous aimez les résultats les mieux.
Bien sûr, réinitialiser les valeurs true lors de la mise à jour est terminé.
Une autre approche est de créer un panneau de superposition de la zone de liste. Ensemble à gauche, à droite, la hauteur et la largeur des propriétés de la même façon que votre zone de liste et définir la propriété visible sur true lors de la mise à jour, faux après que vous avez terminé.
OriginalL'auteur Beth