DataBinding ComboBox d'un champ de type entier avec vb.net et ado.net

Résolu
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008 - 17 oct. 2004 à 06:16
jpeman Messages postés 22 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 24 mai 2005 - 24 mai 2005 à 14:18
Bonjour à tous

J'essai de faire un DataBinding sur un combobox et sa marche presque, il n'y a qu'un problèmme que j'expose ici.

Voila j'ai deux table dans ma base de données
une table

element
NoEl de type Auto increment donc un entier
TypeEl de type chaine de caractère
DescEl de type chaine de caractère

une table facturation qui contient plusieurs champs dont :
NoEl --> fait référence au champ NoEl de la table element

Voila ce que je veut faire c'est afficher tout les DescEl d'un TypeEl de la table elementdans le comboBox et le binder avec NoEl de facturation.
Je sait sa a l'air tordu ou même impossible, mais sa se fait c'est certain avec des AddHandler pour parse et format je l'ai fait pour un CheckBox binder avec un champ texte. Bon

Dans mon programme il y a des dizaine de ComboBox alors je fait une classe pour faire ce Binding.

Bon maintenant que j'ai expliquer ce que je veut faire et de quelle facon je met le code de la classe et ensuite j'explique ce qui fonctionne pas.

'Classe BindingCbo
But : Permet de binder un champ de type entier d'un DataSet à un combobox (Type chaine)
'Ce qui fait dirrectement le transfert dans le DataSet pour le NoEl, mais affiche DescEl

Public Class BindingCbo

Private m_cboCtrl As ComboBox 'Le controle combobox
Private m_dsEl As DataSet 'Dataset contenant les éléments (NoEl et DescEl) de la table élément
Private m_cboBinding As Binding 'L'objet Binding pour le combobox
Private m_DataSource As String

'Paramètres :
'
'cbo : Le controle ComboBox à binder
'dsEl : DataSel qui contient les éléments possibles
' il ne doit y avoir que les champs NoEl et DescEl
'dsToBind : Le dataset à binder avec le combobox
'DataSource : Le nom donné à la table dans dsEl ex : Element
'DataMember : Table.champ à binder ex : facturation.NoEl

Public Sub New(ByVal cbo As ComboBox, ByVal dsEl As DataSet, ByVal dsToBind As DataSet, ByVal DataSource As String, ByVal DataMember As String)
m_cboCtrl = cbo
m_dsEl = dsEl
m_DataSource = DataSource

m_cboCtrl.DataSource = m_dsEl.Tables(m_DataSource)
m_cboCtrl.DisplayMember = "DescEl"

m_cboBinding = New Binding("text", dsToBind, DataMember)
AddHandler m_cboBinding.Parse, AddressOf cboParse
AddHandler m_cboBinding.Format, AddressOf cboFormat
m_cboCtrl.DataBindings.Add(m_cboBinding)
End Sub

'Transfert les données du dataset ver le combobox
Private Sub cboFormat(ByVal sender As Object, ByVal e As ConvertEventArgs)
Dim i As Integer = 0
MessageBox.Show("sdasdasdasd")
While i <= m_dsEl.Tables(m_DataSource).Rows.Count - 1 AndAlso _
CInt(e.Value) <> CInt(m_dsEl.Tables(m_DataSource).Rows(i).Item("NoEl"))
i = i + 1
End While

If i = m_dsEl.Tables(m_DataSource).Rows.Count Then
e.Value = CStr(m_dsEl.Tables(m_DataSource).Rows(0).Item("DescEl"))
Else
e.Value = CStr(m_dsEl.Tables(m_DataSource).Rows(i).Item("DescEl"))
End If
End Sub

'Transfert les données du combobox vers le dataset
Private Sub cboParse(ByVal sender As Object, ByVal e As ConvertEventArgs)
Dim i As Integer = 0
MessageBox.Show(CStr(e.Value))
While i <= m_dsEl.Tables(m_DataSource).Rows.Count - 1 AndAlso _
CStr(e.Value) <> CStr(m_dsEl.Tables(m_DataSource).Rows(i).Item("DescEl"))
i = i + 1
End While

If i = m_dsEl.Tables(m_DataSource).Rows.Count Then
e.Value = CInt(m_dsEl.Tables(m_DataSource).Rows(0).Item("NoEl"))
Else
e.Value = CInt(m_dsEl.Tables(m_DataSource).Rows(i).Item("NoEl"))
End If
End Sub

'Débinder le combobox
Public Sub Clear()
m_cboCtrl.DataBindings.Clear()
End Sub

End Class

Bon voila pour le code.
Si mon comboBox est de type simple tout fonctionne à merveille et tout le monde est heureux ya plus de problèmme

Par contre si le comboBox est de type DropDown ou DropDownList le cboFormat fonctionne, mais pas le cboParse.
Donc le transfert du dataset ver le combobox se fait, mais pas l'inverse.

C'est quoi le problèmme sa me tu sa.
Si quelqu'un a la réponse ou à déjà eu ce problèmme j'aimerais bien des réponse S.V.P.

Merci pour l'aide et pour le temps

3 réponses

mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
17 oct. 2004 à 06:57
Bonjour à tous
Oubliez tout ce que j'ai dit, tout est faux. je me suis tromper.
La vrai solution est bien plus simple.

on n'a pas besoin de modifier de lignes, on n'a qu'a mettre ces ligne pas besoin de la classe.

m_cboCtrl.DataSource = m_dsEl.Tables(m_DataSource)
m_cboCtrl.ValueMember = "NoEl"
m_cboCtrl.DisplayMember = "DescEl"
m_cboBinding = New Binding("SelectedValue", dsToBind, DataMember)

Voici seulement ces lignes dans votre code, mais modifier avec vos nom de variables et sa fait.

Désolé pour la perte de temps.
3
mortiis Messages postés 120 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 9 mars 2008
17 oct. 2004 à 06:42
Bonjour à tous

J'ai trouver. voici les lignes de code à modifier :

m_cboCtrl.DataSource = m_dsEl.Tables(m_DataSource)
m_cboCtrl.ValueMember = "NoEl"
m_cboCtrl.DisplayMember = "DescEl"
m_cboBinding = New Binding("SelectedValue", dsToBind, DataMember)

Le tout fonctionne bien alors si quelqu'un à a faire la même chose la classe est prête.

J'aimerais quand même si quelqu'un connait un moyen plus performant qu'il m'en fasse part.

Merci.
0
jpeman Messages postés 22 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 24 mai 2005
24 mai 2005 à 14:18
j'ai rien compris a ton programme

=======
JPeman
=======
0
Rejoignez-nous