cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018
-
8 juil. 2015 à 18:03
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023
-
9 juil. 2015 à 06:46
Bonjour le Forum,
Suite à extraction d'un fichier xml, j'obtiens un ToList
MyJobs = (From k In MyList, a In k.Applications, j In a.Jobs Select j.AffecteParent(a, k)).OrderBy(Function(j) j.EnvironnementApplicationJob).ToList()
Pour charger dans un DatagridView
Me.DataGridView1.DataSource = MyJobs
Sur un formulaire, pour afficher une sélection, via un ComboBox, dans le DGV, j'utilise
Private Sub ComboBoxDDO_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBoxDDO.SelectedIndexChanged ' IsLoading est True quand load DGV ok (function btnPDP_Click) If IsLoading = True Then Dim MyFilter As List(Of JOB) = MyJobs.Where(Function(c) (c.DDO = ComboBoxDDO.SelectedItem.ToString())).ToList() Me.DataGridView1.DataSource = MyFilter End If End Sub
Jusqu'ici tout est ok !!!
Mon problème, je souhaiterai, via un bouton de validation et un textbox comprenant la saisie d'une expression, rechercher dans tous les champs (une trentaine) de la ToList "MyJobs" toutes les zones comprenant cette saisie.
Mes recherches sur MSDN et les méthodes Findall, Any, Contains n'ont pas abouti.
Merci de vos conseils pour m'orienter sur la bonne méthode à utiliser.
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621 8 juil. 2015 à 20:49
Bonsoir,
une précision avant tout, tu n'obtiens pas un ToList, mais une List(of), pour le coup List(Of Job).
La requête retourne une collection Ienumerable.
C'est ce type de collection qui permet l'évaluation différée de la requête, ce qui peut être pratique quand on maitrise bien, mais peut être piégeux quand on débute (et même après!).
J'ai donc évité le piège en forçant l'évaluation immédiate, pour cela il faut convertir le type de collection c'est le rôle de la méthode ToList(), mais il existe aussi ToArray(), ça aurait fait un tableau de Job.
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826 8 juil. 2015 à 20:54
Bonsoir Whismeril,
Merci de tes conseils avertis.
Je vais donc potasser MSDN sur la méthode des tableaux.
Bonne soirée,
@+
jean-marc
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621
>
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018 8 juil. 2015 à 21:33
Mais non un tableau est bien moins pratique qu'une liste. Je voulais essayer de te faire comprendre que ToList n'est pas ton résultat mais une partie des calculs pour obtenir le résultat.
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621 8 juil. 2015 à 21:03
Pour ta question proprement dite.
Il y a trois solutions, soit tu fais une clause where dans laquelle tu évalues chaque champ avec un ou (exemple sur 3 champs)
Dim texteAChercher As String = "coucou"
Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
Where j.EnvName.Contains(texteAChercher) Or j.Host.Contains(texteAChercher) Or j.Name.Contains(texteAChercher)
Select j).ToList()
Tu peux créer une fonction dans Job, qui teste chaque champ est qui retourne True s'il y a une occurrence, ça allégera la requête
'la fonction
Public Function RechercheTousLesChamps(TexteACharcher As String) As Boolean
RechercheTousLesChamps = False
If Name.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Or Host.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Then RechercheTousLesChamps = True
End Function
'la requête adaptée
Dim texteAChercher As String = "coucou"
Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
Where j.RechercheTousLesChamps(texteAChercher)
Select j).ToList()
Enfin tu peux utiliser la réflexion, ça je ne sais pas faire en VB
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826 8 juil. 2015 à 21:27
Je vais opter pour ta première proposition.
La recherche d'une expression ne devant être effectuée que sur 3 ou 4 champs au max.
Cela permettra une réponse quasi immédiate puisque inutile de parcourir toutes les colonnes/lignes de la List(Of Job).
J'ai déjà créé une vingtaine de combobox pour choix éventuel de l'utilisateur.
Quand à Réflexion, je n'ai pas regardé plus loin que mon nez cette méthode.
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826 8 juil. 2015 à 22:08
J'ai testé ta première proposition.
Elle répond à ma demande.
Merci,
jean-marc
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201826 8 juil. 2015 à 22:33
En fait, je ne savais pas que l'on pouvait faire un "Select x).ToList()" sans préciser un champ "Select x.Name).ToList()"
Whismeril
Messages postés18281Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 mars 2023621
>
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 2018 9 juil. 2015 à 06:46
Select retourne l'objet que tu cherches, dans ce cas il doit s'agir d'un job, si tu retournes x.Name, tu auras une erreur de conversion impossible de string vers job.
Par contre si tu as besoin de retourner seulement les Host, là il faut dimensionner une liste de string et retourner x.Host.
8 juil. 2015 à 20:54
Merci de tes conseils avertis.
Je vais donc potasser MSDN sur la méthode des tableaux.
Bonne soirée,
@+
jean-marc
8 juil. 2015 à 21:33