Probleme BindingSource Filter
Salut tout le monde, J'utilise VB Net(2008) avec SQLEXPRESS (2008 R2) dans des formulaires Windows j'ai bc de problème avec le BindingSource Filter. Est-ce possible de remplacer les noms des colonnes d'un dataTable par un comboBox dans lequel on retrouve par la propriété Item Collection les noms des colonnes du dataTable ex: CustomerID, si possible svp m'expliqué comment?. Je sais pour l'avoir expérimenté lorsque je le code comme cela, ca marche : BindingSource1.Filter = "CustomerID='Bonap '"
Comme je le mentionné plut haut j'aimerais utiliser le comboBox pour n'avoir pas a réécrire les noms des colonnes du dataTable a chaque nouvelle fois que l'on veut filtré le dataGridView, Merci a l'avance
bindingsource.filter,criteres
bonjour andy38,
comme l'as dit sinople ,tu peux utiliser le combobox pour les noms de colonnes
Pour les criteres il y a une astuce qui consiste à lier le cavalier à sa selle pour eviter le probleme qu'il a mentionne( taper les criteres dans un textbox) c'est d'utiliser le champ string Tag d'un 2ème combobox de selection des criteres dans lequel tu mettras le critere.
Ainsi:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
cboVoirTout.Items.add("Tous les enregistrements") 'chaine dans combobox
cboVoirTout.Tag="All"
BindingSource.Filter = stringNomColonne & "= ' & cboVoirTout.Tag & "'"
'un champ nombre ,un champ texte et AND
cboAge.Items.add(nbAge) 'liste des nombre age dans combobox
cboAge.ValueMember=nbAge
cboAge.Tag="= '" & SelectedValue 'critere
cboGendre.Items.add(Gendre) 'liste des noms gendre dans combobox
cboAge.ValueMember=Gendre
cboAge.Tag=" AND = " & SelectedValue 'critere
BindingSource.Filter = stringNomColAge & ' & cboAge.Tag & "' " & stringNomColGendre & ' cboGendre.Tag & "'" |
comme cela l'utilisateur a l'air de choisir un critere qui est en fait est associe et ecris par tes soins dans le champ tag.
Pour les nombres il faut passer egalement par des combox
Ceci evitera le probleme de controle du type de donnees saisies par l'utilsateur.
bon code....
BINDING SOURCE FILTER,beaucoup de colonnes
bonjour andy38
en relisant ton post je me suis rendu compte que tu avais aussi un probleme de nombre de colonnes excessif.
Eh bien voici le bout de code repris en utilisant un bindind source au lieu et place du dataview,l'utilisation des combobox est la meme.
Mais palsambleu,il fallait y penser pour le nombre de colonnes il suffit d'une astuce c'est de les rendre invisibles au depart et apres chaque filtrage.
Ensuite rendre visibles uniquement les colonnes concernees. par le filtrage.
Voici le bout de code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
'DataGridView dynamique n'affiche que les colonnes concernees
'Utilise BindingSource au lieu de DataView
'Rend invisible toutes les colonnes
'Rend visibles uniquemment les colonnes concernees par le filtrage
'la table "Personnel" a ete renommer en "Client"
Imports System.Data
Public Class frmDTGridDyn
Public Sub New()
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'remplir la table Client au demarrage
'Necessaire pour "Filler" les combobox
Try
Me.ClientTableAdapter1.ClearBeforeFill = True
Me.ClientTableAdapter1.FillTout(Me.ClientDS1.Client)
'Ligne à Rajouter pour "Filler" DataGridView1
ClientDS1BindingSource.DataSource = ClientDS1
ClientDS1BindingSource.DataMember = ClientDS1.Client.TableName
DataGridView1.DataSource = ClientDS1BindingSource
'Astuce (Rend Invisible Toutes Les Colonnes)
For I As Integer = 0 To DataGridView1.Columns.Count - 1
DataGridView1.Columns.Item(I).Visible = False
Next
btnFilterNom.Enabled = True
btnFilterNomNumeroInscription.Enabled = True
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
'ici sans changement(comme dans le dataview)
'1-Inititialise les 2 combobox pour le bouton Filter par Nom
'combo nom de colonne Nom
cboColNom.Items.Add(ClientDS1.Client.Columns(1).ColumnName)
cboColNom.DisplayMember = ClientDS1.Client.Columns(1).ColumnName
cboColNom.ValueMember = ClientDS1.Client.Columns(1).ColumnName
cboColNom.Tag = "=" 'operateur egal
'combo selectionner valeur champ Nom
For Each valeurChamp As DataRow In ClientDS1.Client.Rows
cboNom.Items.Add(valeurChamp(1))
cboNom.DisplayMember = valeurChamp(1) 'champ affiche (peut etre different par ex:prenom)
cboNom.ValueMember = valeurChamp(1) 'valeur selectionne
Next
'2-Inititialise les 2 combobox pour le bouton Filter par Nom et NumeroInscription
'combo nom colonne Prenom
cboColPrenom.Items.Add(ClientDS1.Client.Columns(2).ColumnName)
cboColPrenom.DisplayMember = ClientDS1.Client.Columns(2).ColumnName
cboColPrenom.ValueMember = ClientDS1.Client.Columns(2).ColumnName
cboColPrenom.Tag = "=" 'operateur egal
'combo selectionner valeur champ Prenom
For Each valeurChamp As DataRow In ClientDS1.Client.Rows
cboPrenom.Items.Add(valeurChamp(2))
cboPrenom.DisplayMember = valeurChamp(2) 'champ affiche
cboPrenom.ValueMember = valeurChamp(2) 'valeur selectionne
Next
'3/combo nom colonne NumeroInscription
cboColNumeroInscription.Items.Add(ClientDS1.Client.Columns(4).ColumnName)
cboColNumeroInscription.DisplayMember = ClientDS1.Client.Columns(4).ColumnName
cboColNumeroInscription.ValueMember = ClientDS1.Client.Columns(4).ColumnName
cboColNumeroInscription.Tag = ">" 'operateur superieur
'3/combo selectionner valeur champ NumeroInscription
For Each valeurChamp As DataRow In ClientDS1.Client.Rows
cboNumeroInscription.Items.Add(valeurChamp(4))
cboNumeroInscription.DisplayMember = valeurChamp(4) 'champ affiche
cboNumeroInscription.ValueMember = valeurChamp(4) 'valeur selectionne
Next
End Sub
'FillByToolStripButton modifie poour rafraichir
'propriete text=Rafraichir les donnees
'Rend Invisible toutes les colonnes
Private Sub FillByToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillByToolStripButton.Click, ToolStripButton1.Click
Try
Me.ClientTableAdapter1.ClearBeforeFill = True
Me.ClientTableAdapter1.FillTout(Me.ClientDS1.Client)
'ligne à rajouter pour rafraichir le DataGridView1
DataGridView1.DataSource = ClientDS1
DataGridView1.DataMember = ClientDS1.Client.TableName
'Rend Invisible Toutes Les Colonnes
For I As Integer = 0 To DataGridView1.Columns.Count - 1
DataGridView1.Columns.Item(I).Visible = False
Next
DataGridView1.Refresh()
'Activer les 2 boutons filtrer
btnFilterNom.Enabled = True
btnFilterNomNumeroInscription.Enabled = True
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
End Sub
'Bouton FilterNom par DataView
'la valeur ValueMember est recupere par SelectedItem
'Faire Parsing de la chaine pour les valeurs numeriques
Private Sub btnFilterNom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFilterNom.Click
Try
ClientTableAdapter1.FillTout(ClientDS1.Client)
ClientDS1BindingSource.DataSource = ClientDS1.Client
ClientDS1BindingSource.Filter = cboColNom.DisplayMember & cboColNom.Tag.ToString & "'" & cboNom.SelectedItem.ToString & "' "
DataGridView1.DataSource = ClientDS1BindingSource
'Colonnes Concernees= Visibles
For I As Integer = 0 To DataGridView1.Columns.Count - 1
If I < 2 Then
DataGridView1.Columns.Item(I).Visible = True
Else
DataGridView1.Columns.Item(I).Visible = False
End If
Next
DataGridView1.Refresh()
'Desactive -Necessite Rafraichir pour etre active
btnFilterNom.Enabled = False
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
End Sub
'Bouton FilterNomNomNumeroInscription par DataView
'la valeur ValueMember est recupere par SelectedItem
'Faire Parsing de la chaine pour les valeurs numeriques
Private Sub btnFilterNomNumeroInscription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFilterNomNumeroInscription.Click
Try
ClientTableAdapter1.FillTout(ClientDS1.Client)
ClientDS1BindingSource.DataSource = ClientDS1.Client
ClientDS1BindingSource.Filter = cboColPrenom.DisplayMember & cboColPrenom.Tag.ToString & "'" & cboPrenom.SelectedItem.ToString & _
"'AND " & cboColNumeroInscription.DisplayMember & cboColNumeroInscription.Tag.ToString & "'" & Integer.Parse(cboNumeroInscription.SelectedItem.ToString) & "'"
DataGridView1.DataSource = ClientDS1BindingSource
'Colonnes Concernees= Visibles
For I As Integer = 0 To DataGridView1.Columns.Count - 1
If I < 5 Then
DataGridView1.Columns.Item(I).Visible = True
Else
DataGridView1.Columns.Item(I).Visible = False
End If
Next
DataGridView1.Refresh()
'Desactive -Necessite Rafraichir pour etre active
btnFilterNomNumeroInscription.Enabled = False
Catch ex As System.Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
End Sub
End Class |
p.j:fichier zip du code
BONNE SOIREE...
BINDING SOURCE FILTER,beaucoup de colonnes
bonjour andy38
Mabrouki,ici en Algerie cette semaine c'est plus tot le vent de sable chose inhabituelle en decembre.Mais la semaine passe des temperatures extremes noctures de 2 et 3 degres sur les hauts plateaux algeriens.Il ne faut pas voir la temperature à Alger parce que c'est la mer.
C'est du coq à l'ane.
Le seul moyen d'echapper ca c'est d'avoir plusieurs pays.Ma grand mere se plaignait des absences de mon grand pere qui etait assez riche pour aller hiverner dans une maison de villegiature au sahara dans une oasis et ne rentrait qu'au printemps pour eviter le froid et la neige.
Pour un Quebequois t'as pas le choix a moins d'etre citoyen de Louisane ou de Floride.
Quand je sais que le general MontCalm a commis l'erreur historique fatale de ne pas emmener autant de colons francais que les english,surtout que le mississipi prends tout son eau au canada.
bon j'essaie de t'envoyer une fois encore les pieces jointes.
Bonne soiree et fais de bon reve en pensant au pere noel et à son manteau
blanc ,c'est la compensation à vos climats brumeux et sans lumiere eblouissante ...