Liaison d'index de deux combobox avec le même datasource, bug ? [Résolu]

Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 11 juin 2010 à 17:38 - Dernière réponse : Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention
- 15 juin 2010 à 07:41
Hello world !
Je viens de remarquer un truc que je ne pige pas ! (normale mais bon ça m'aggace)

Sur une form je place deux combobox que je renseigne avec le même datasource.
Lors de l'éxécution le choix de l'un modifie le choix de l'autre ! c'est un bug ou bien ?
j'ai besoin d'avoir des choix différents lors de la selection de ces combobox et j'ai pas envie de passer par un item.add, j'ai vérifier sur le ent et j'ai pas encore de piste.
Si quelqu'un sait pourquoi cela m'irais bien.
code :
Private Sub F30_segment_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ComboDeb.DataSource = Form1.affaire.type_segment
        ComboFin.DataSource = Form1.affaire.type_segment
    End Sub


affaire.type_segment étant une classe instancié en public dans la form1 et contenant une list(of string).

je continue mes recherches en attendant je vous remercie pour la lecture et les réponses éventuelles.
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 11 juin 2010 à 19:55
3
Merci
Re ;O)

Bon alors... Il semblerait que la propriété DataSource du combobox ne se contente pas de remplir bêtement les membres de celui-ci, en effet il agit comme un bindingSource, en gros il garde en mémoire l'élément sélectionné et déclanche une sorte d'événement pour prévenir les autres contrôles du changement de la sélection.

La solution ? Très simple bien entendue tiens en seulement 700 lignes de codes !! Mais non je déconne =)

Bref, le but à atteindre est en fait de cloner tes List(Of String) et comme bien entendue celle-ci ne possède pas de procédure clone il va falloir la créer à partir de ? de..? de...? D'une classe hérité bien sûr ^^

Il te faudra donc ajouter cette classe à ta classe affaire :

<Serializable()> _
Public Class ClonableList
    Inherits List(Of String)
    Public Function Clone() As ClonableList
        Return CType(Me.MemberwiseClone, ClonableList)
    End Function
End Class


Par la suite modifier ta classe affaire elle-même :

Public type_segment As New ClonableList  'listes des choix de bout de segment


Et pour finir appeler cette procédure pour le remplissage des combos :

Private Sub F30_segment_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ComboDeb.DataSource = Form1.affaire.type_segment.Clone
    ComboFin.DataSource = Form1.affaire.type_segment.Clone
End Sub 


Et le tour est joué !

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

Merci Mayzz 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Mayzz
Meilleure réponse
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 13 juin 2010 à 11:39
3
Merci
Et voila :

Dim listDeb As New List(Of String)
listDeb.AddRange(malist)
combo1.datasource = listdeb
combo2.datasource = malist


OUF ^^

Merci Adn56 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 11 juin 2010 à 20:37
0
Merci
mouarff en effet c'est simple
je ne ferais pas mieux de contourner le soucis en ajoutant avec une boucle tous les items de ma list(of string ?)

Merci pour le tuto t'es trop balaise poto !
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 11 juin 2010 à 20:42
0
Merci
Je ne pense pas car si tu as d'autres formulaires à ajouter à ton projet, tu sera obligé de passer par des boucles à chaque fois, qu'une fois ma méthode appliqué, tu n'as plus qu'a utiliser le "Clone" pour tous tes autres formulaires.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 13 juin 2010 à 11:21
0
Merci
Je pige a peu pres ta class (à part le MemberwiseClone) mais bon je trouve anormal de ne pas pouvoir copier une collection de string !
si je fais :
dim a as new list(os string)
a = form1.malist
ou dim a as list(of string) = form1.malist
et que je fais ensuite :
a.add("tyty")
Et bien je retrouve tyty dans form1.malist !

J'ai essayé aussi de supprimer le databinding des combo mais cela ne change rien
combo.databinding.clear()

cela m'agacce car c'est pas logique pour moi !
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 13 juin 2010 à 11:34
0
Merci
Voici l'explication, cela viens de l'emplacement mémoire, grrr. Les list(of) ne sont pas sur la pile mais dasn le tas lol, du coup je ne fais que copier le pointeur (en pile) qui adresse (le tas).
D'ou ta fonction clone qui ne fais en somme que creer une nouvelle instance de l'objet.
Du coup je ne pige pas pourquoi cela ne marche pas lorsque je fais :
dim a as new list(of string)
a = form1.malist
ou alors faire un truc
for i = 0 to form1.malist.count-1
a.add(form1.malist.item(i))
next
a tester ^^
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 13 juin 2010 à 15:42
0
Merci
Salut ADN,

Ca sert d'avoir de solide base en C et autres langages bas niveau pour savoir qu'est ce qui se trame derière le managé ^^

Petit complément d'information qui te permettra sans doute de mieux comprendre :

En vb, tu auras pu remarqué que lors d'un passage d'argument à une méthode, il y a toujours les mots-clés ByVal ou ByRef qui reviennent.
En vérité, ByVal passe en paramètre la valeur, et ByRef l'objet en lui même (Par référence à l'adresse mémoire).

C'est un peux identique avec les classes,lors ce que tu fais :

Dim List1 As New List(Of String)
With List1
    .Add("Tata")
    .Add("Toto")
End With
Dim List2 As List(Of String)
List2 = List1


Cela ne copie les valeurs de la liste dans une nouvelle instance de celle-ci mais fait pointer la List2 vers l'adresse mémoire ou se trouve la list1, c'est bien pour cette raison que l'on parle d'instance pour les classes et non pour les variables.

Le mot clé new, crée un espace réservé dans la mémoire et renvoi la référence dans la variable portant le nom de la classe, ainsi si tu fais :

dim a as new list(of string) 'Tu déclare un nouvel objet Vide, strucuré 
'sous vb pour recevoir les données de ta classe, et tu réserve un nouvel 
'espace mémoire à l'aide de new, la variable a, pointera vers cet espace
'mémoire.

a = form1.malist 
'Ici tu efface simplement l'adresse pointant vers ton espace mémoire de a pour la remplacer par celle de form1.malist.


Il est aussi possible de faire du ByRef pour les variables :

Private Sub Form1_Load() Handles Me.Load
   Dim Toto As String = "Tata"
   Call TotoByVal(Toto)
   Call TotoByRef(Toto)
End Sub
Private Sub TotoByRef(ByRef Toto As String)
    Toto = "Titi"
End Sub
Private Sub TotoByVal(ByVal Toto As String)
    Toto = "Titi"
End Sub


Je te laisse le soin de faire un teste avec des points d'arrêt pour voir ce qui se passe même si je sais que tu t'en doute déjà...

Cela permet d'avoir plusieurs références à un seul objet.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 13 juin 2010 à 16:35
0
Merci
PS: Petite précision, quand je parlais de bases en langages bas niveau je parlais pour toi bien entendu ^^

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 13 juin 2010 à 18:02
0
Merci
Oui en effet mon expé avec les automates me permet de comprendre ce truc, en fait nous utilisons aussi un ACCU (en fait deux mais bon) pour passer temporairement des valeurs à la cpu lors de calcul.
Si j'écris :
L MW0 je charge la valeur contenu à l'adresse MW0 dans l'accu1
L 2 je charge 2 dans l'accu2
MUL I (je multiplie l'accu1 et l'accu2, I pour integer)
T MW0 (je transfert le résultat à l'adresse MW0, dans le mot quoi)
J'utilse bien une Pile et un TAS, mais je m'en occupe pas, c'est transparent.
La "vrai" mémoire (ici le tas), elle se trouve dans les mots de l'eeprom. Cela me rassure donc, même si en automatisme basique c'est transparent pour l'user, je ne m'en sert que pour gérer des pointeurs lors de valeurs indéxé. Ex j'ai 10 recettes (tableau de valeurs) stocké dans MW0 à MW9 pour la 1, MW10 à MW19 etc... Je peux alors appeller la recette choisi par l'utilisateur via son numéro de cette façon :
soit MW300 le numéro de la recette de 0 à 9 et MW100 à MW109 la recette de travail que je charge via :
MW300 * 10
MW100 := MW0[MW300] ce qui reviens à ajouter à 0 la valeur de MW300 en adresse. donc 0,10,20,30...
MW101 := MW1[MW300], bien sûr on fait une boucle sur les 10mots à lire, on a quant même un language évolué hein
Mais bon faut le savoir qu'en .net cela marche comme ça :p
aprés ça roule.

Merci l'ami. ++
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 13 juin 2010 à 18:12
0
Merci
Hummm... Pas ma ton langage, ca marche en vb

OK, je sors

=>>

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 13 juin 2010 à 20:40
0
Merci
ben écoute cela doit pas être si éloigné puisque j'y arrive en .NET
note que pas trop car j'ai encore un souci avec ces maudites combobox
regarde (suite à la source que je t'ai envoyé j'ai corriger un ou deux truc, mais voila elle refuse toujours de renseigner ma class, je m'en suis apercu car je viens d'implenter la modif des segments. Et là rien à faire elle refuse tout simplement de bien attribuer le texte choisi à la propriété de ma classe. Bon j'ai écrit cela aprés la sieste j'ai peut être la tête dasn le cul et le cul dans le brouillard, mais je ne m'explique pas le binsss ! (en plus j'ai l'impression qu'une sur deux est bien renseigné, mais j'ai pas fait de stats lol) ci joint le code

Option Explicit On
Option Strict On
Public Class F30_segment

    ' instance de travail
    Private _segment As cls_segment = Nothing

    Private Sub F30_segment_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'renseigne les source des combobox en recréant une nouvelle instance de la list
        'car sinon les combos sont liés, NB:un object ne se copie pas avec =, mais en créant une nouvelle instance !
        'EX : dim a as list(os string) = form1.affaire.type_segment, ne fais que copier le pointeur de pile vers les valeurs du tas
        Dim listDeb As New List(Of String)
        listDeb.AddRange(Form1.affaire.type_segment)
        ComboDeb.DataSource = listDeb 'Form1.affaire.type_segment
        ComboFin.DataSource = Form1.affaire.type_segment

    End Sub

    ' appel pour un nouveau segment
    Public Overridable Overloads Function Show(ByVal Id_reseau As Integer, ByVal Id_segment As Integer) As cls_segment
        Me.Text = "Créer un nouveau segment"

        _segment = Nothing
        _segment = New cls_segment
        _segment.Id = Id_segment

        ' Valeur par défaut
        Txt_nom.Text = "S" & Id_reseau.ToString & "-" & Id_segment.ToString
        Txt_longueur.Text = ""
        Txt_commentaire.Text = ""

        ' affiche le bouton annuler
        Bp_quit.Visible = True
        MyBase.ShowDialog()
        Return _segment
    End Function
    ' appel pour la modification d'un segment
    Public Overridable Overloads Function Show(ByVal segment_modif As cls_segment) As cls_segment
        Me.Text = "Modifier ce segment"
        _segment = segment_modif

        Txt_nom.Text = _segment.nom
        Txt_longueur.Text = _segment.longueur.ToString
        Txt_commentaire.Text = _segment.commentaire
        ComboDeb.SelectedItem = _segment.type_deb
        ComboFin.SelectedItem = _segment.type_fin

        ' cache le bouton annuler
        Bp_quit.Visible = False
        MyBase.ShowDialog()
        Return _segment
    End Function

    Private Sub Bp_ok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_ok.Click
        valide()
    End Sub


    Private Sub Bp_quit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_quit.Click
        _segment = Nothing
        Me.Close()
    End Sub




    Private Sub valide()
        If Txt_nom.Text <> Nothing And Txt_longueur.Text <> Nothing Then
            _segment.nom = Txt_nom.Text
            _segment.longueur = CDbl(Txt_longueur.Text)
            _segment.commentaire = Txt_commentaire.Text
            _segment.type_deb = ComboDeb.SelectedItem.ToString <= ICI
            _segment.type_fin = ComboFin.SelectedItem.ToString <= ET ICI RIEN NE VAS PLUS 

            Me.Close()
        Else
            If Txt_nom.Text Nothing Then Txt_nom.BackColor Color.Firebrick
            If Txt_longueur.Text Nothing Then Txt_longueur.BackColor Color.Firebrick
        End If
    End Sub


End Class
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 13 juin 2010 à 21:02
0
Merci
Ben heu...

Tu parles de quels champs ? Tous ou un en particulier ? Perso comme ca je ne vois pas trop...

En fait pour la modif, tu overrides le sub Show donc...

Dim s As New cls_Segment' Nouvel instance d'un segment
s.Nom = "Toto" 'on définit sa propriété nom

F30_segment.show(s)'On appel la feuille chargé de modification 
'de mon segment de sorte à ce que l'utilisateur puisse le modifier 
'visuellement

'Mais show ne lance pas la form en mode modale, donc l'exécution de mon
'programme continue...
s.Nom = "Tata"' La valeur du nom de mon segment vient de changer...
'
'Et paf, l'utilisateur qui vient de fermer la F30 a modifier le nom,
'De ce fait, le nom a encore changé


Cela ne viendrait-il pas de la ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 14 juin 2010 à 07:27
0
Merci
En fait tout marche bien lors d'une modif, et la fenêtre est bien modal car j'ai rajouté cela :
MyBase.ShowDialog()
Note que je ne sais plus pourquoi j'ai overrides le show, plutot que le showdialog ????
Bref cela vient uniquement de ces comboboxs, elle ne retourne pas bien le choix. J'ai une reunion ce matin, mais juste aprés je regarde cela avecmon cerveau tout propre du lundi.

@++

PS:Je veux bien voir la méthode que tu aurais utilisé pour passer ces class à tes forms
Commenter la réponse de Adn56
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 14 juin 2010 à 10:12
0
Merci
Bon voila bug trouvé, en fait dans le load je renseigne le datasource du combo, dans le show je renseigne le selectItem du combo en fonction du segment passé en paramétre pour modification.
Visiblement le load se fait aprés le show et du coup réinitialise la combo.
J'ai placé le remplissage de la combo dans le show, avant le seltecItem et tout fonctionne bien.

maintenant cette façon de passer les objet de ma class au form ne me plait pas. Je vais plutôt passer l'instance _segment en public et la renseigner directement lors de l'appel de la form, avec en même temps les combos et tout le toutim.
voila ++
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 14 juin 2010 à 13:58
0
Merci
On va en revenir à ma méthode de travaille :

Tu crée une prop Segment au sein de ta form, tu l'instancie, renseigne sa propriété segment, appel le showdialog.

En gros, cela fonctionne comme une openfiledialog.

Un form est avant tout une classe.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 14 juin 2010 à 17:53
0
Merci
Bhé oui, c'est ce que je fais en plus dasn mon code de compte bancaire
dim nouvelleForm as new MyformQuiVaBien
whit nouvelleform
.text = blabla
.segment monsegmentAmodifier ou .segment new cls_segment
end
nouvelleform.showdialog

Je ne comprend pas pourquoi je suis parti dans cette voie cette fois-ci ?

Bon je fini le dessin de segments/réseau et marquage en GDI et j'attaque ces modifs.
c'est puissant le GDI mais il faut chercher un peu partout !
Ex: Reussir à faire un demi cercle avec trois couleur de dégradé (1/2heure de recherche/codage)!
msdn powaaaa
Tiens ya peut être un tuto à faire la dessus :p
++

' définie un double dégradée via colorblend (couleur puis position de 0 à 100%)
        Dim couleurs As Color() = {Color.Black, Color.White, Color.Black}
        Dim posCouleurs As Single() = {0.0F, 0.5F, 1.0F}
        Dim monDegrade As New ColorBlend
        monDegrade.Colors = couleurs
        monDegrade.Positions = posCouleurs

        'cercle de fin ( double dégradé géré par interpolationcolors de la brush ) 
        Dim zone As New Rectangle(CInt(largueur - CInt(largueur / 10) - CInt(diametre / 1)) _
                                    , CInt(hauteur / 2) - CInt(diametre / 2) _
                                    , diametre _
                                    , diametre)
        degrade = New LinearGradientBrush(zone, Color.Black, Color.White, LinearGradientMode.Vertical)
        degrade.InterpolationColors = monDegrade
        g.DrawEllipse(Pens.Black, zone)
Commenter la réponse de Adn56
Mayzz 2859 Messages postés mardi 15 avril 2003Date d'inscription 26 novembre 2013 Dernière intervention - 14 juin 2010 à 20:25
0
Merci
Ben j'avais fait un source GDI/Dégradé mais rien à voir...

En ce qui concerne les tutos je bosse déjà sur le prochian, WebService ASP.Net + Winform ;O)

Mais toi tu pourrais t'y mettre ^^

@+ et bon codage à toi !

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Commenter la réponse de Mayzz
Adn56 1220 Messages postés jeudi 24 mai 2007Date d'inscription 28 septembre 2013 Dernière intervention - 15 juin 2010 à 07:41
0
Merci
Oula j'ai déja du mal à apprendre alors faire apprendre

J'en ferais peut être un sur les classes métier (enfin imbriquées).

Bon codage à toi aussi.
Commenter la réponse de Adn56

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.