DataBinding ComboBox d'un champ de type entier avec vb.net et ado.net [Résolu]

mortiis 120 Messages postés mardi 11 février 2003Date d'inscription 9 mars 2008 Dernière intervention - 17 oct. 2004 à 06:16 - Dernière réponse : jpeman 22 Messages postés samedi 18 janvier 2003Date d'inscription 24 mai 2005 Dernière intervention
- 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
Afficher la suite 

3 réponses

Meilleure réponse
mortiis 120 Messages postés mardi 11 février 2003Date d'inscription 9 mars 2008 Dernière intervention - 17 oct. 2004 à 06:57
3
Merci
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.

Merci mortiis 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

mortiis 120 Messages postés mardi 11 février 2003Date d'inscription 9 mars 2008 Dernière intervention - 17 oct. 2004 à 06:42
0
Merci
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.
jpeman 22 Messages postés samedi 18 janvier 2003Date d'inscription 24 mai 2005 Dernière intervention - 24 mai 2005 à 14:18
0
Merci
j'ai rien compris a ton programme

=======
JPeman
=======

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.