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

 

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

Binding Navigator & Data Validation σε κάθε του ενέργεια

Îåêßíçóå áðü ôï ìÝëïò Dark Dominion. Τελευταία δημοσίευση από το μέλος KelMan στις 05-03-2007, 14:46. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  04-03-2007, 14:49 25854

    Binding Navigator & Data Validation σε κάθε του ενέργεια

    Έχω ένα μικρό πρόγραμμα το οποίο λειτουργεί ως interface για μία βάση. Ο χρήστης προσθέτει, αφαιρεί και μετακινείται μεταξύ των τιμών με ένα Binding Navigator. Θέλω στη περίπτωση που κάποιο από τα components δεν έχει πάρει τιμή, ο χρήστης να μη μπορεί να μετακινηθεί μεταξύ των εγγραφών και να του πετάγεται ένα messagebox ότι λείπει κάτι στην συγκεκριμένη εγγραφή (Το οποίο θα τονίζεται από την εμφάνιση ενός μηνύματος του error provider). Αν είναι εύκολο ας μου δώσει κάποιος ένα απλό παράδειγμα. Ευχαριστώ.

    Κουλούρης Θάνος
  •  04-03-2007, 17:14 25857 σε απάντηση της 25854

    Απ: Binding Navigator & Data Validation σε κάθε του ενέργεια

    Αυτό που ψάχνεις είναι ο μηχανισμός για validation σε Windows Forms (υποθέτω ότι αναφέρεσαι σε εφαρμογή Windows Forms).

    Γενικά, κάθε φόρμα (και κάθε control) παρέχει δύο events το Validating και το Validated που χρησιμοποιούνται για ...validation. Το Validating event τρέχει αμέσως μόλις το εκάστοτε control αποκτήσει input αλλά πριν θεωρηθεί valid αυτό το input και είναι το event που συνήθως χρησιμοποιείται στο databinding. To Validated event τρέχει μόλις το input θεωρηθεί valid. Μόλις ένα control καταλάβει ότι ο χρήστης έχει τελειώσει και έχει δώσει input (δηλαδή όταν πάει να φύγει το focus επειδή ο χρήστης μεταφέρθηκε σε επόμενο control) τότε τρέχει το Validating event. Ο τύπος του event είναι CancelEventHandler που δέχεται ένα CancelEventArgs όρισμα. Αυτό το όρισμα περιέχει ένα property που ονομάζεται Cancel που αν μέσα στον event handler του δώσουμε τιμή true τότε το control καταλαβαίνει ότι το validation έχει αποτύχει. Έτσι, το focus δεν θα φύγει και ο χρήστης αναγκάζεται να διορθώσει το input πριν προxωρίσει στο επόμενο control. Παράδειγμα:

       Private Sub textBox1_Validating(ByVal sender As Object, _
       
    ByVal e As System.ComponentModel.CancelEventArgs) Handles textBox1.Validating

          Dim errorMsg As
    String
          If Not ValidEmailAddress(textBox1.Text, errorMsg) Then
             ' Cancel the event and select the text to be corrected by the user.
             e.Cancel = True
             textBox1.Select(0, textBox1.Text.Length)
          End If
       End Sub

    Βέβαια, πολλές φορές είναι εκνευριστικό να μην μπορείς να προχωρήσεις (και ιδιαίτερα να σου πετάγονται Message Boxes) και έτσι δεν χρησιμοποιείται ακριβώς αυτή η τεχνική αλλά η τεχνική του να παρέχεις στο χρήστη συνολικά πληροφορίες στο τέλος, πριν να πατήσει το OK button. Χρησιμοποιείται ένα ErrorProvider control το οποίο εμφανίζει ένα κόκκινο θαυμαστικό δίπλα στο control με την invalid τιμή. Ο χρήστης μπορεί να μετακινηθεί σε όποιο control θέλει αλλά τελικά θα πρέπει να τα διορθώσει όλα.

       Private Sub textBox1_Validating(ByVal sender As Object, _
       ByVal e As System.ComponentModel.CancelEventArgs) Handles textBox1.Validating

          Dim errorMsg As String
          If Not ValidEmailAddress(textBox1.Text, errorMsg) Then
             ' Set the ErrorProvider error with the text to display.
             Me.errorProvider1.SetError(textBox1, errorMsg)
          End If
       End Sub

    Μια τέτοια τεχνική περίπου μπορείς να ακολουθήσεις κι εσύ. Επιπρόσθετα, μπορείς να έχεις μια boolean μεταβλητή πχ FieldsAreValid σε επίπεδο φόρμας που αν οποιοδήποτε control την θέσει σε false (κατά το Validating event του), τότε δεν αφήνεις να ολοκληρωθεί το navigation event. Στην περίπτωση του BindingNavigator αλλάζεις τα MoveFirstItem, MoveLastItem, MoveNextItem και MovePreviousΙtem σε (none). Κατόπιν, για κάθε ένα από τα buttons γράφεις τον κώδικα για να χειριστείς ο ίδιος το Navigation. Πχ.

        Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                                    Handles BindingNavigatorMoveNextItem.Click
            If FieldsAreValid Then
                BindingSource1.MoveNext()
            
    Else
                ...

            End If
        End Sub

    Αυτό είναι σε γενικές γραμμές το validation των Windows Forms. Δεν ξέρω κατά πόσο θα σε βοηθήσουν τα παραπάνω καθώς περιγράφεις πολύ γενικά το τι θέλεις να κάνεις. Θα πρέπει να είσαι πιο συγκεκριμένος στο τι θέλεις να κάνεις για να σου δώσουμε κι εμείς με τη σειρά μας πιο συγκεκριμένη απάντηση. Μπορείς να το ψάξεις παραπάνω στο MSDN, θα βρεις αρκετό υλικό για να το ψάξεις παραπάνω καθώς υπάρχουν κι άλλες τεχνικές όπως για παράδειγμα να παίξεις με το validation σε επίπεδο φόρμας.

     


    Vir prudens non contra ventum mingit
  •  05-03-2007, 14:06 25902 σε απάντηση της 25854

    Απ: Binding Navigator & Data Validation σε κάθε του ενέργεια

    Βασικά σκεφτόμουν να κάνω Validation σε όλα τα textboxes & comboboxes, στο event που γίνεται το validation της φόρμας και να καλώ το event κάθε φορά που ο χρήστης προσπαθεί να μετακινηθεί μεταξύ των εγγραφών. Και στη περίπτωση που κάτι είναι λάθος να το καταλαβαίνει μέσω των μηνυμάτων που θα εμφανίζει ο error provider.

    Κουλούρης Θάνος
  •  05-03-2007, 14:46 25906 σε απάντηση της 25902

    Απ: Binding Navigator & Data Validation σε κάθε του ενέργεια

    Δεν γίνεται καλείς το event γιατί το event τρέχει κάτω από συγκεκριμένες συνθήκες. Υποθέτω ότι αυτό που εννοείς είναι να φτιάξεις μια ρουτίνα που θα κάνει validation, την οποία θα καλείς στα events μετακίνησης. Άρα δεν έχει νόημα να μπλέξεις με το Validating event της φόρμας, εφόσον θέλεις να κάνεις το validation σε συγκεκριμένη στιγμή που εσύ επιλέγεις.


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