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

 

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

Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

Îåêßíçóå áðü ôï ìÝëïò George J. Capnias. Τελευταία δημοσίευση από το μέλος George Parissis στις 12-03-2011, 12:13. Υπάρχουν 19 απαντήσεις.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-03-2011, 11:59 63981

    Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    To σενάριο:
    • Υπάρχουν κάποιες custom classes - θέλετε να τις πείτε Business classes, θέλετε να τις πείτε Entity classes, δεν θα πειραχτώ - το θέμα είναι ότι υλοποιούν τα INotifyPropertyChanging, INotifyPropertyChanged και IDataErrorInfo interfaces.
    • Κάθε κλάση από αυτές έχει οριστεί σαν Data Source σε ένα Windows Source project και το ζητούμενο είναι να φτιαχτούν φόρμες (με DataViewGrid και απλές φόρμες/details view) που θα συνδεθούν με τα controls της φόρμας με την χρήση BindingSource control και το validation θα γίνει με την χρήση του ErrorProvider control.
    Ερωτήματα:
    • Οι classes είναι ικανές να ανταπεξέλθουν σε αυτό το σενάριο; Η χρειάζομαι και άλλα πράγματα, πχ interfaces, που πρέπει να υλοποιηθούν;
    • Αν και έχω δει demo (της Beth Massi) που κάνει το data binding επάνω σε datagridview control, έχει κάποιος βρει/δει/διαβάσει το ίδιο σενάριο για details view;

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  06-03-2011, 17:19 63986 σε απάντηση της 63981

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Έχω δουλέψει Γιώργο LINQ To SQL classes, δημιουργώντας parial classes για το entity class που θέλω και κάνωντας implement to IDXDataErrorInfo της DevExpress
    μπορούσα να κάνω το Validation για όποιο property ήθελα σε GridView και Details View.

    Ευκολο βολικό και παίζει.



  •  08-03-2011, 09:52 64024 σε απάντηση της 63981

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Μόνο 3 interfaces?! Stick out tongue

    Αν θυμάμαι καλά, υπάρχουν καμιά 30ριά interfaces που σχετίζονται με το databinding σε windows forms. Αν θες για παράδειγμα να υποστηρίζεις "undo", θα πρέπει να υλοποιήσεις το IEditableObject. Αν θες να φτιάξεις λίστες που να παρέχουν πλήρες functionality ως binding sources υπάρχουν πάλι αρκετά interfaces που θα πρέπει να υλοποιήσεις.

    Προτείνω να κοιτάξεις το βιβλίο Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET του Brian Noyes. Έχει τα πάντα μέσα, υποθέτω τα κεφάλαια 7, 9 και 10 θα σου φανούν πολύ χρήσιμα.


     

     


    Vir prudens non contra ventum mingit
  •  08-03-2011, 11:44 64026 σε απάντηση της 64024

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    KelMan:

    Μόνο 3 interfaces?! Stick out tongue

    Αν θυμάμαι καλά, υπάρχουν καμιά 30ριά interfaces που σχετίζονται με το databinding σε windows forms. Αν θες για παράδειγμα να υποστηρίζεις "undo", θα πρέπει να υλοποιήσεις το IEditableObject. Αν θες να φτιάξεις λίστες που να παρέχουν πλήρες functionality ως binding sources υπάρχουν πάλι αρκετά interfaces που θα πρέπει να υλοποιήσεις.

    Προτείνω να κοιτάξεις το βιβλίο Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET του Brian Noyes. Έχει τα πάντα μέσα, υποθέτω τα κεφάλαια 7, 9 και 10 θα σου φανούν πολύ χρήσιμα.

    Βασικά "κλέβω" περισσότερο από ότι φαντάζεσαι - αν σκεφτείς ότι τα objects είναι της μορφής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.Data.Objects.DataClasses;
    using System.ComponentModel.DataAnnotations;
    using System.Reflection;
    
    namespace TimeLogger
    {
        public class BussinessObject : StructuralObject, IDataErrorInfo
        {
    
            // Properties go here...
    
    
            #region ' IDataErrorInfo Members '
    
            public string Error
            {
                get { return string.Empty; }
            }
    
            public string this[string columnName]
            {
                get
                {
    
                    List<ValidationAttribute> validationAttributes = new List<ValidationAttribute>();
    
                    MetadataTypeAttribute metadataType = this.GetType().GetCustomAttributes(true).OfType<MetadataTypeAttribute>().FirstOrDefault();
                    if (metadataType != null)
                    {
                        PropertyInfo p = metadataType.MetadataClassType.GetProperty(columnName);
                        if (p != null)
                        {
                            validationAttributes = p.GetCustomAttributes(true).OfType<ValidationAttribute>().ToList();
                        }
                    }
    
                    PropertyInfo currentProperty = this.GetType().GetProperty(columnName);
                    validationAttributes.AddRange(currentProperty.GetCustomAttributes(true).OfType<ValidationAttribute>().ToList());
    
                    foreach (ValidationAttribute currentAttribute in validationAttributes)
                    {
                        try
                        {
                            currentAttribute.Validate(currentProperty.GetValue(this, null), columnName);
                        }
                        catch (Exception ex)
                        {
                            return ex.Message;
                        }
                    }
    
                    return string.Empty;
                }
            }
    
            #endregion
        }
    }

    Όπου το StructuralObject abstract class - του .NET Framework είναι v3.5 SP1/v4.0 - μου δίνει implementation του INotifyPropertyChanging, INotifyPropertyChanged χωρίς να κάνω τίποτα και το implementation του IDataErrorInfo ουσιαστικά ελέγχει για Validation attributes του System.Data.Annotations επάνω στο ίδιο object ή σε metadata object επάνω σε αυτό.

    Το θέμα είναι ότι για να κάνεις binding με BindingSource, θεωρητικά θα πρέπει να φτάνουν αυτά τα 3 μιας και τα υπόλοιπα τα αναλαμβάνει το BindingSource (IBindingList, IBindingListView, IEditableObject, ICancelAddNew) - βλ. Interfaces Related to Data Binding.

    Θα κοιτάξω να βρω το βιβλίο μήπως και ανακαλύψω κάτι παραπάνω...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  08-03-2011, 11:57 64028 σε απάντηση της 64026

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    To BindingSource από μόνο του δεν κάνει και πολλά. Βασίζεται στο support (δηλαδή τα interfaces) που του παρέχει το binded object. Αν είναι για παράδειγμα κάποια μορφή λίστας θα πρέπει να υλοποιεί διάφορα interfaces, γι αυτόν τον λόγο το BindingSource έχει τις μεθόδους SupportsSorting(), SupportsFiltering(), SupportsSearching(), SupportsAdvancedSorting(), SupportsChangeNotification(). Το ότι έχει για παράδειγμα το property Sort δεν σημαίνει ότι θα sortάρει τα data αν το collection δεν υποστηρίζει το IComparable (αν δεν κάνω λάθος για το όνομα του interface). Αν δεν υποστηρίζει το collection, θα ορίσεις το Sort property και απλά θα το αγνοήσει.
    Vir prudens non contra ventum mingit
  •  08-03-2011, 13:07 64030 σε απάντηση της 64028

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    KelMan:
    To BindingSource από μόνο του δεν κάνει και πολλά. Βασίζεται στο support (δηλαδή τα interfaces) που του παρέχει το binded object. Αν είναι για παράδειγμα κάποια μορφή λίστας θα πρέπει να υλοποιεί διάφορα interfaces, γι αυτόν τον λόγο το BindingSource έχει τις μεθόδους SupportsSorting(), SupportsFiltering(), SupportsSearching(), SupportsAdvancedSorting(), SupportsChangeNotification(). Το ότι έχει για παράδειγμα το property Sort δεν σημαίνει ότι θα sortάρει τα data αν το collection δεν υποστηρίζει το IComparable (αν δεν κάνω λάθος για το όνομα του interface). Αν δεν υποστηρίζει το collection, θα ορίσεις το Sort property και απλά θα το αγνοήσει.

    Δεν αντιλέγω σε αυτό - διαβάζοντας το BindingSource Component Architecture - στο κάτω μέρος, αναφέρει καθαρά ότι όταν στο BindingSource λάβει ένα List<T> σαν DataSource το μετατρέπει σε IBindindList<T> - οπότε καθαρά ότι έρχεται μαζί με το IBindingListView (sorting, filtering) δεν υπάρχει...

    Αλλά αυτό που έχεις είναι αρκετό για DataBinding - ενημέρωση & validation μέσα από DataGridView και windows forms controls... To θέμα είναι αν τα INotifyPropertyChanging, INotifyPropertyChanged και IDataErrorInfo interfaces μπορούν να στηρίξουν λύσεις που χρησιμοποιούνται custom objects σαν Data Sources μέσα σε ένα Windows Forms project και με τους wizards να παρέχονται μέσα από το Visual Studio να ολοκληρώσεις μια λύση...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  08-03-2011, 14:32 64031 σε απάντηση της 64030

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Χρησιμοποιώ Custom Objects με DataBinding σε όλες μου τις εφαρμογές. Δεν θυμάμαι να υπάρχει κάποια χωρίς DataBinding. Δεν είχα ποτέ πρόβλημα. Τα interfaces είναι δύο που θα έβαζα must να υλοποιηθούν. Το INotifyPropertyChanged και το IDatatErrorInfo αν θέλεις validation. Τα υπόλοιπα και ναι και όχι. Για παράδειγμα κάποια controls τρίτων κατασκευαστών μπορούν να κάνουν sort την λίστα σου χωρίς εσύ να έχεις υλοποιήσει κάποιο interface από την δική σου μεριά. Επίσης πάντα χρησιμοποιώ BindingList(T) όταν θέλω Events από την λίστα που κρατάει τα custom objects μου.

    Για τα περισσότερα σενάρια ένα BindingList μαζί με ένα custom object που να κάνει implement το INotifyPropertyChanged είσαι μια χαρά.

  •  08-03-2011, 15:02 64032 σε απάντηση της 64031

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Χρησιμοποιώ αυτήν την Sortable Binding List: Presenting the SortableBindingList<T> αλλά είμαι ανοιχτός σε εναλλακτικές λύσεις.



    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  08-03-2011, 16:36 64035 σε απάντηση της 64030

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    George J. Capnias:

    Αλλά αυτό που έχεις είναι αρκετό για DataBinding - ενημέρωση & validation μέσα από DataGridView και windows forms controls... To θέμα είναι αν τα INotifyPropertyChanging, INotifyPropertyChanged και IDataErrorInfo interfaces μπορούν να στηρίξουν λύσεις που χρησιμοποιούνται custom objects σαν Data Sources μέσα σε ένα Windows Forms project και με τους wizards να παρέχονται μέσα από το Visual Studio να ολοκληρώσεις μια λύση...

     

    George J.

    Γιώργο, είναι αρκετά εφόσον θες να κάνεις αυτά για τα οποία προορίζονται. Αν μείνεις στο drag'n'drop από το Data Sources window. Από εκεί και πέρα εξαρτάται το σενάριο, όπως το undo που λέγαμε. Μπορεί να ζητηθεί στην πορεία οπότε θα χρειαστείς να υλοποιήσεις και το IEditableObject. Επίσης, μπορεί να χρειαστεί να υλοποιήσεις και το ICancelAddNew. Αν φτιάξεις έξυπνα εξ αρχής την υποδομή σου δεν θα χρειαστεί αργότερα να κάνεις δύσκολo re-engineering.

     


    Vir prudens non contra ventum mingit
  •  08-03-2011, 19:08 64039 σε απάντηση της 64035

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Τι μου θυμίζει, τι μου θυμίζει...

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  09-03-2011, 01:34 64052 σε απάντηση της 64035

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    KelMan:
    Γιώργο, είναι αρκετά εφόσον θες να κάνεις αυτά για τα οποία προορίζονται. Αν μείνεις στο drag'n'drop από το Data Sources window. Από εκεί και πέρα εξαρτάται το σενάριο, όπως το undo που λέγαμε. Μπορεί να ζητηθεί στην πορεία οπότε θα χρειαστείς να υλοποιήσεις και το IEditableObject. Επίσης, μπορεί να χρειαστεί να υλοποιήσεις και το ICancelAddNew. Αν φτιάξεις έξυπνα εξ αρχής την υποδομή σου δεν θα χρειαστεί αργότερα να κάνεις δύσκολo re-engineering.

    Νομίζω ότι φαντάζεσαι πάνω-κάτω τι έχω στο μυαλό μου - μιλάμε για EntityObjects ή πλέον POCOs που πολύ εύκολα - πιθανώς με κάποιο T4 - μπορείς να τα "φορτώσεις" ότι απαιτείται με την μικρότερη δυνατή υλοποίηση.

    Θα μου πεις γιατί το Data Annotation -> δουλεύει για ASP.NET και για WPF/Silverlight. Οπότε να κάνω μια υλοποίηση για το WinForms για αυτό ουσιαστικά θα κάνει πιο "universal" τα POCOs μου, ακριβώς για να αποφύγω το re-engineering του business model μου...


    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-03-2011, 01:39 64053 σε απάντηση της 64039

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    Markos:

    Μην σου θυμίζει - και το DataRowView και το DataView φτιάχτικαν για ακριβώς αυτό το σκοπό - να εξυπηρετήσουν το Windows Forms DataBinding. 

    Και μετά κατάλαβαν τι λάθος έκαναν - τα objects ήταν "too heavy" για να χρησιμοποιηθούν για άλλους σκοπούς εκτός από το DataBinding - έτσι και πρέκυψε το IBindingList<T> και IBindingListView<T> που ήρθαν με το .NET Framework v2.0, που βασικά δεν καταστούν απαραίτητη την χρήση τους πλέον...


    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-03-2011, 01:53 64055 σε απάντηση της 64026

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control -

    George J. Capnias:
    KelMan:
    Προτείνω να κοιτάξεις το βιβλίο Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET του Brian Noyes. Έχει τα πάντα μέσα, υποθέτω τα κεφάλαια 7, 9 και 10 θα σου φανούν πολύ χρήσιμα.

    Θα κοιτάξω να βρω το βιβλίο μήπως και ανακαλύψω κάτι παραπάνω...

    Ωραίο βιβλίο έχει αρκετά που θα είναι καλά για κάποιον που ξεκινάει, αλλά το άτιμο και πάλι δεν έχει μια αναφορά πως να κάνεις ένα DataBinding σε windows forms με custom objects και να μην το κάνει με DataGridView και να δείχνει και validation. Μέχρι και η Julie Lerman στο "Use an Entity Framework Entity as a Winforms Data Source" η περιγραφή είναι σε DataGridView και χωρίς validation...

    Κάτι μου λέει ότι θα αρχίσω να διαβάζω Rockford Lhotka μπας και ανακαλύψω κάτι - Παναγιώτη σου κουνάω το "κόκκινο πανί", αρκετά σιωπηλός είσαι στο θέμα!


    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-03-2011, 11:23 64059 σε απάντηση της 64055

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control -

    Γιατί το παιδεύεις τόσο πολύ; Αν θυμάμαι καλά, το DataGridView τσιμπάει αυτόματα το IDataErrorInfo οπότε δεν θα έχεις πρόβλημα. Δοκίμασέ το σε ένα proof-of-concept να δεις...

    Ως προς την έξυπνη σχεδίαση, εννοούσα (μιας και χρησιμοποιήσεις Τ4) να βάλεις partial classes και να υλοποιούνται έτσι κι αλλιώς τα IEditableObject, κλπ ώστε αν απαιτηθεί κάποιος να μπορεί με το partial class να προσθέσει εύκολα το απαραίτητο functionality.

    Πάντως, σκοπεύεις να κάνεις edit πάω στο DataGridView; Γενικά εγώ το αποφεύγω όσο μπορώ και προτιμώ να βγάζω child form. Συνήθως φαίνεται εύκολο στην αρχή αλλά σταδιακά έρχονται απαιτήσεις που στο τέλος λες "να είχα βάλει child form να τελείωνα".

     


    Vir prudens non contra ventum mingit
  •  09-03-2011, 12:36 64060 σε απάντηση της 64053

    Απ: Windows Forms data-binding με BindingSource control & Validation με ErrorProvider control

    George J. Capnias:
    ...

    Και μετά κατάλαβαν τι λάθος έκαναν - τα objects ήταν "too heavy" για να χρησιμοποιηθούν για άλλους σκοπούς εκτός από το DataBinding - έτσι και πρέκυψε το IBindingList<T> και IBindingListView<T> που ήρθαν με το .NET Framework v2.0, που βασικά δεν καταστούν απαραίτητη την χρήση τους πλέον...


    George J.



    Τα DataRowView και DataView, μόνο DataBinding (και γενικότερα presentation) σκοπούς εξυπηρετούν. Για τα υπόλοιπα υπάρχουν τα DataTable και DataRow. Επιπλέον, όσο περισσότερα interfaces υλοποιεί κανείς τόσο "παχαίνει" τα objects του. Το πρόβλημα ποτέ δεν ήταν τα DataSets και τα DataTables, αλλά το γεγονός ότι οι προγραμματιστές ποτέ δεν κατάλαβαν πως πρέπει να στείλουν τις αλλαγές στη βάση. Αυτό, όμως, είναι θέμα μιας άλλης συζήτησης.

    Όσον αφορά στο validation, τα πράγματα είναι απλά. Ένα σχετικό άρθρο είναι το Simple Validation with LINQ to SQL classes, της Beth Massi. Μία γενικότερη εισαγωγή πάνω στο θέμα του custom object binding προσφέρουν αυτά τα εισαγωγικά videos. Για πιο προχωρημένα πράγματα, όπως multicolum filtering μπορεί κανείς να ανατρέξει σ' αυτό το άρθρο. Επίσης, μια χρήσιμη πηγή είναι κι αυτή.

    Όσον αφορά στο presentation και το validation όταν μιλάμε για custom object ή entities, το πρόβλημα κατά τη γνώμη μου γίνεται δύσκολα διαχειρίσιμο όταν θέλει κανείς να επιβάλλει unique constraint rules. Εκεί, λόγω του fragmentation στα children lists γίνεται το "έλα να δεις"!! Το ίδιο ισχύει με το filtering, αν κανείς θέλει να επιβάλλει κάποιο rule σε όλα τα children. Εκεί το DataSet είναι απλά, "αχτύπητο"...

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems