J'ai lié mon DataGrid à un DataTable et seulement quelques détails sont affichés dans la grille. Lorsque je voulais filtrer le DataGrid, j'ai créé une vue avec ItemsSource de mon DataGrid. code:Problème avec le filtrage DataGrid
Dim myView As ICollectionView = CollectionViewSource.GetDefaultView(MyDGrid.ItemsSource)
myView.Filter = New Predicate(Of Object)(AddressOf filterFunc1)
Maintenant, quand je fais la recherche, les champs non affichés sont également inclus dans la recherche.
Public Function filterFunc1(ByVal obj As Object) As Boolean
Dim filStr As String = "*" & TextBox1.Text & "*"
For Each item As String In obj.Row.ItemArray
**If item.ToLower Like filStr.ToLower Then**
Return True
End If
Next
Return False
End Function
J'ai également des champs ComboBox dans le DataGrid qui sont chargés séparément des autres DataTable. Maintenant, je ne peux pas les inclure dans la recherche.
Une capture d'écran de mon application:
Alors, comment puis-je faire une recherche qui ne comprend que le texte de la partie affichée.
EDIT: Comment puis-je ignorer la recherche dans les champs à valeurs nulles? Parce que cela provoque une exception dans mon cas.
Salut Alex, Merci pour la réponse. Premièrement, l'erreur avec DBNull est dans 'For Each'. Qu'il ne peut pas convertir un DBNull en String.Exactement où dois-je mettre la syntaxe de conversion? Deuxièmement, je n'ai pas imposé une recherche par colonne, mais une recherche sur tout le réseau. Comme vous le dites, cela pourrait être une mauvaise pratique. Je vais le changer! Et pourquoi dis-tu que je devrais récupérer seulement les champs que je vais utiliser? Et avec la chose de liste déroulante, Ma table principale avec laquelle j'ai créé la vue pour le filtre n'a pas les valeurs directement à la place de leurs identifiants. dites l'ID d'état. Maintenant, je ne peux pas rechercher les combobox avec la vue que j'ai. – sarath
En utilisant Linq, vous pourriez dire 'pour chaque élément dans obj.Row.ItemArray.OfType (String)()' (c'est hors de ma tête donc je ne suis pas sûr que la syntaxe est correcte, n'ont pas fonctionné en VB depuis longtemps) . En outre, la recherche de grille complète aurait dû être évidente, oui; Dans ce cas, votre approche n'est pas si mauvaise, ce dont je me plaignais était de chercher directement sur un DataTable ... ce qui limite l'extensibilité, etc. Comme pour le ComboBox, vous avez peu de choix en plus de garder à la fois les légendes et les identifiants éléments chargés et obtenant les identifiants lors de la recherche; Je mettrai à jour ma réponse avec une suggestion. –
La technique que vous avez suggérée est plus ou moins la même que la mienne. Au lieu d'avoir une classe j'utilise un DataTable qui a les champs Id et Status name. Mon DataGridComboBox est lié à cette source avec le statusId (de la table principale) lié. Mais mon problème est que ma fonction de filtre effectue la recherche sur la ** table principale ** (View) qui n'a pas les valeurs réelles (dites Medium, Low) mais id (3,6). Si tu veux, je posterai mes structures de table ici. Et je suis nouveau à .Net Alex. Je n'ai pas commencé à lire MVVM. Bien sûr :) – sarath