Le tri des nœuds enfants de l'un treeview après le remplissage de l'arborescence en c#, winforms
J'ai du mal à trier les nœuds enfants d'un treeview dans mon winforms programme. Mon treeview est peuplé par quelques fichiers XML et utilise un interne de texte à l'intérieur du xml fichiers comme du Texte, propriété de nœuds (Donc je pense que je ne peux pas les trier avant de les ajouter à l'arborescence, ou si c'est possible, car les fichiers xml sont de grande taille je ne veux pas perdre le processus). Une peuplé treeview dans mon programme ressemble à ceci:
Comme vous pouvez le deviner, je veux les nœuds enfants de trier les aime (je ne veux pas HBM\D10 à venir après HBM\D1) plutôt que je veux:
HBM\D1
HBM\D2
HBM\D3
etc...
J'ai déjà essayé treeView1.Sort() et l'ajout d'beginUpdate et endUpdate mais je n'avais pas suceess 🙁
Je suis à l'aide .NET 4, des conseils seraient appriciated
ok je sortet à l'aide de Thomas conseils:
class NodeSorter : IComparer
{
public int Compare(object x, object y)
{
TreeNode tx = (TreeNode)x;
TreeNode ty = (TreeNode)y;
if (tx.Text.Length < ty.Text.Length)
{
return -1;
}
if (tx.Text.Length > ty.Text.Length)
{
return 1;
}
return 0;
}
}
OriginalL'auteur Saeid Yazdani | 2011-04-11
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour créer un personnalisé programme et de l'affecter à la
TreeViewNodeSorter
propriété:vous avez besoin de trier par le texte de la TreeNode selon votre propre logique, c'est à dire extraire le numéro de partie de le texte, et de les comparer en nombre si le reste du nom est égal
Dans l'ordre pour que cela fonctionne sur .net 4(Windows 8) j'ai dû le faire hériter de Comparer<TreeNode> et mettre en œuvre les Comparer comme
public override int Compare(TreeNode Node1, TreeNode Node2)
il n'y a pas de raison de le faire. Même dans .NET 4.5, le
TreeViewNodeSorter
propriété est till de typeIComparer
, pasIComparer<T>
. Je soupçonne que vous étiez en manque juste un espace de noms à l'importation... Le code que j'ai posté fonctionne avec .NET 4.x de la même manière qu'avec les versions antérieures.J'ai corrigé le code pour spécifier l'espace de noms explicitement
OriginalL'auteur Thomas Levesque
Vous êtes en utilisant un tri alphabétique, de sorte D10 vient après D1.
Vous devriez essayer de trier rejet "D" char et de convertir le reste de la chaîne en nombre.
OriginalL'auteur Marco
J'ai écrit certains personnalisée comparateurs de faire de la création de la comparer vous avez besoin ici est un peu plus facile à faire:
MultiComparer
etProjectionComparer
. Ensemble, vous pouvez créer un comparateur de trier ce que vous avez besoin à la volée sans avoir à créer une classe en main. Ce que j'ai à fournir ici n'est pas réellement comment je dois les classes écrit, je l'ai découpée beaucoup de code pour des raisons de concision (même si gauche certains des aides pour être plus facile à utiliser).Pour créer les comparer:
Et les classes:
OriginalL'auteur Jeff Mercado
Voici la solution que j'ai utilisé dans mon projet en cours.
OriginalL'auteur jo_Veera