2010-08-03 9 views
1

J'utilise un DataGrid pour afficher les valeurs de propriétés spécifiques d'une collection d'objets. J'ai mis en application la recherche et la mise en évidence de cellule par une méthode semblable à celle sur Tomer Shamam's blog.WPF: DataGrid Rechercher et remplacer

Cependant, je dois maintenant implémenter la fonctionnalité de type 'Find/Replace'. Je supposais que je serais capable de parcourir les cellules de DataGrid pour effectuer des mises en évidence et des remplacements, mais il ne semble pas y avoir de moyen simple de le faire.

Des idées?

Répondre

1

Je pense que vous avez peut-être un mauvais état d'esprit dans ce scénario, peut-être que vous venez de WinForms au monde WPF ...

En DataGrid WPF vous manipuler essentiellement jamais de données via le DataGrid, vous travaillez toujours sur la DataSource directement. Quant à "il ne semble pas y avoir un moyen simple de le faire" - vous avez raison. Ça va être plus difficile que ça ne le devrait.

Si je devais mettre en œuvre un Rechercher/Remplacer fonction - chaque clic serait d'abord mettre en évidence la prochaine occurence alors je peux choisir de sauter/find_next ou remplacer - alors c'est ainsi que je le ferais:

1) Nous devons connaître notre position actuelle - DataGrid.CurrentItem donne l'objet actuel (source de données);
2) Nous effectuons maintenant une recherche sur la source de données pour trouver l'occurrence suivante à partir de l'emplacement actuel des objets (par exemple var indx = List<object>.FindIndex(...) suivi de var nextItem = List<object>[indx]);
3) Ensuite, nous devons faire défiler le DataGrid à l'objet trouvé et mettre le DataGridRow en vue - DataGrid.ScrollIntoView(nextItem); (vous devrez peut-être faire DataGrid.UpdateLayout() avant l'appel, il semble y avoir quelques bizarreries avec le .NET 4 construit -dans DataGrid dans mon expérience);
4) Vous devriez déjà savoir comment mettre en évidence une cellule ...;
5) Attendre que l'utilisateur entre, saute ou remplace;
6) Si nous remplaçons alors nous pouvons utiliser DataGrid.CurrentItem ou la variable nextItem et remplacer une valeur par une nouvelle valeur. Selon la façon dont vous avez configuré votre DataGrid, vous devrez peut-être effectuer un appel Refresh()/UpdateLayout() ou un appel BindingOperations.GetBindingExpression (...). UpdateTarget() pour mettre à jour le DataGrid;
7) Enfin, retournez à l'étape 1 et répétez;

+0

Très tard, mais juste pour quelqu'un d'autre intéressé, cela pourrait aider (en particulier une question au bas de l'article lié à DataGrids) - http://www.codeproject.com/Articles/889607/A-Rich-Find -Et-Remplacer-Contrôler-Pour-Presque-Tout-WPF –