Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Συγχρονισμός 2 ComboBox

Îåêßíçóå áðü ôï ìÝëïò Filaretos. Τελευταία δημοσίευση από το μέλος Filaretos στις 29-12-2009, 16:19. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-12-2009, 18:27 56085

    Συγχρονισμός 2 ComboBox

    Win Forms
    Vb.net

    ‘Εχω 2 ComboBox.
    Το 1ο έχει την ομάδα των προϊόντων:
    -    Όλες οι Ομάδες
    -    1η Ομάδα
    -    2η Ομάδα
    -    3η Ομάδα

    Το 2ο έχει τα προϊόντα:
    -     Όλα τα προϊόντα
    -    Προϊόν 1 (1η Ομάδα)
    -    Προϊόν 2 (1η Ομάδα)
    -    Προϊόν 3 (3η Ομάδα)
    -    Προϊόν 4 (2η Ομάδα)
    -    Προϊόν 5 (2η Ομάδα)
    -    Προϊόν 6 (3η Ομάδα)
    -    Προϊόν 7 (1η Ομάδα)

    Αυτό που θέλω να κάνω είναι:
    1.    Όταν επιλέγω από το 1ο ComboBox μια ομάδα προϊόντων να μου φέρνει τα αντίστοιχα προϊόντα στο 2ο ComboBox.
    2.    Όταν επιλέγω από το 2ο ComboBox ένα προϊόν, το 1ο ComboBox να ¨μετακινείται¨ στην αντίστοιχη ομάδα του προϊόντος.

    Έχω υλοποιήσει την 1η περίπτωση χρησιμοποιώντας το ¨SelectedIndexChanged¨ του 1ου  ComboBox.

    Το πρόβλημα είναι όταν εφαρμόσω το ίδιο event και στο 2ο  ComboBox, ¨πυροδοτείται¨ ξανά το event SelectedIndexChanged του 1ου ComboBox και πάει λέγοντας...

    Και λίγο κώδικας:
    '----------------------------------------------------------------------------------------------------------
        Private Sub cmbProf_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbProf.SelectedIndexChanged
            '1o ComboBox
            Try
                If cmbProf.SelectedValue = -1 Then
                    Me.QryProfTableAdapter.Fill(Me.DbDataSet.qryProf)
                Else
                    Me.QryProfTableAdapter.FillBy(Me.DbDataSet.qryProf, New System.Nullable(Of Integer)(CType(cmbProf.SelectedValue, Integer)))
                End If            
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show(ex.Message)
            End Try
        End Sub

        Private Sub cmbProfDetails_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbProfDetails.SelectedIndexChanged
            '2o ComboBox
            Dim profDetailsValue As Integer
            profDetailsValue = New System.Nullable(Of Integer)(CType(cmbProfDetails.SelectedValue, Integer))
            Me.cmbProf.SelectedValue = profDetailsValue
        End Sub
      '----------------------------------------------------------------------------------------------------------

    Πως θα μπορούσε να υλοποιηθεί ο συγχρονισμός 2 ComboBox;
    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  28-12-2009, 09:33 56092 σε απάντηση της 56085

    Απ: Συγχρονισμός 2 ComboBox

    Μία εύκολη λύση είναι να ορίσεις μία μεταβλητή σαν Flag.

    Παράδειγμα. Όταν ξεκινάει το πρόγραμμα η μεταβλητή θα είναι True.

    Όταν αλλάξεις ομάδα και είσαι μέσα στο SelectedIndexChanged event θα ελέγχεις αν η τιμή της μεταβλητής είναι True. Αν είναι τότε την κάνεις εσύ False και εκτελείς τον κώδικά σου για να φορτώσεις τα προιόντα. Μόλις τελειώσεις την κάνεις True.

    Όταν αρχίσεις να φορτώνεις τα προιόντα τότε με την σειρά του ο κώδικας θα μπει μέσα στο SelectedIndexChanged event του αντίστοιχου combo box. Και εκεί το πρώτο που θα κάνεις είναι να ελέγχεις αν η τιμή τις μεταβλητής είναι True. Επειδή εδώ δεν είναι γνωρίζεις πως η αλλαγή ήλθε από μία επιλογή του χρήστη στις ομάδες και όχι από τα προιόντα.

    Όταν τελειώσουν όλα να εκτελούνται τότε θα έχεις τα προιόντα σου και την τιμή της μεταβλητής σε True.

    Όταν ο χρήστης επιλέξει ένα προιόν τότε στο αντίστοιχο event κάνει έλεγχο για την τιμή της μεταβλητής. Η τιμή της είναι True. Την κάνεις False και αλλάζεις το selectedvalue στο combo των ομάδων. Στο τέλος αφού τελειώσεις την κάνεις True.

    Είναι λίγο μπερδεμένο με την πρώτη ματιά αλλά μόλις καταλάβεις τι ακριβώς γίνεται τότε είναι απλό.

  •  28-12-2009, 13:44 56094 σε απάντηση της 56085

    Απ: Συγχρονισμός 2 ComboBox

    Λοιπόν, φίλε μου Φιλάρετε, το synchronization σε comboboxes (υποθέτο δηλαδή το βασικό σενάριο master detail) είναι κάτι που όλοι το έχουμε συναντήση. Στο .net framework 2.0μ και άνω, αν χρησημοποιείς Visual Studio 2005 (και άνω), τα περισσότερα γίνονται με point και click μέσα από το UI του VS. Σου έφτιαξα γρήγορα γρήγορα ένα μικρό project σε VS2008 και .net framework 2.0 (είναι σε C# αλλά δεν σε νοιάζει καθόλου γιατί είναι όλο point και click).

    Χρησημοποιεί την διάσημη Adventureworks (έκδοση sql server 2005) για ΒΔ και εσύ το μόνο που χρειάζεται να προσέξεις είναι τα properties των 2 comboboxes και το dataset. Στην ουσία, αν έχεις υλοποιήση σωστα της σχέση σου στην ΒΔ, χρησημοποιόντας datasets, είναι πάρα πολύ απλό.

    Επιλέγεις κάτι από το πρώτο combo box και το δεύτερο φιλτράρετε αυτόματα με τις εγγραφές που αντιστοιχούν στην πρώτη επιλογή.

    Μια μικρή παρατήρηση:
    Η υλοποίσης της επιλογής (ΟΛΑ) στα Comboboxes είναι μια άλλη ιστορία για την οποία θα χρειαστεί να γράψεις custom code σε κάποια events.

    Sample project εδω.

    Ελπίζω να βοήθησα.


    Application Developer

    Mediocrity knows nothing higher than itself, but talent instantly recognizes genius.
  •  29-12-2009, 16:19 56111 σε απάντηση της 56092

    Απ: Συγχρονισμός 2 ComboBox

    infoCenter σε ευχαριστώ για την απάντηση.
    Χρησιμοποίησα την ¨λογική¨ του flag και δούλεψε μια χαρά.
    Παραθέτω τον κώδικα:
    '-------------------------------------------------
        Private Sub cmbProf_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbProf.SelectedIndexChanged
            '1o ComboBox
            If checkComboBox = True Then
                checkComboBox = False
                Try
                    If cmbProf.SelectedValue = -1 Then
                        Me.QryProfTableAdapter.Fill(Me.DbDataSet.qryProf)
                    Else
                        Me.QryProfTableAdapter.FillBy(Me.DbDataSet.qryProf, New System.Nullable(Of Integer)(CType(cmbProf.SelectedValue, Integer)))
                    End If
                Catch ex As System.Exception
                    System.Windows.Forms.MessageBox.Show(ex.Message)
                End Try
                checkComboBox = True
            End If
        End Sub

        Private Sub cmbProfDetails_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbProfDetails.SelectedIndexChanged
            '2o ComboBox
            Dim profDetailsValue As Integer
            If checkComboBox = True Then
                checkComboBox = False
                Try
                    profDetailsValue = New System.Nullable(Of Integer)(CType(cmbProfDetails.SelectedValue, Integer))
                    Me.cmbProf.SelectedValue = profDetailsValue
                Catch ex As Exception
                    System.Windows.Forms.MessageBox.Show(ex.Message)
                End Try
                checkComboBox = True
            End If
        End Sub
    '-------------------------------------------------

    Φίλε GNSpng σε ευχαριστώ πολύ τον κόπο σου.
    Το συγκεκριμένο δεν έχει κάνει με το σενάριο Master-Detail γιατί πρέπει να παίζει το σενάριο ¨Όλα¨ και στα 2 ComboBox  αλλά και να μπορεί να κάνει επιλογή από το 2o ComboBox και να του φέρει όλες τις Ομάδες με επιλογή στην ομάδα που ανήκει το προϊόν.  Παρόλα αυτά σε ευχαριστώ και πάλι για το κόπο σου (ίσως φάνει ποιο χρήσιμο σε  κάποιον άλλο συνάδελφο).

       

    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems