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

 

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

Βοήθεια για DataGridView

Îåêßíçóå áðü ôï ìÝëïò vwpolo16v. Τελευταία δημοσίευση από το μέλος Markos στις 26-12-2008, 00:46. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-06-2008, 10:41 42597

    Βοήθεια για DataGridView

    Θα ήθελα την πολύτιμη βοήθεια σας για κάτι... Φτιάχνω ένα πρόγραμμα καταχώρησης παραγγελιών. Αυτό που θέλω να κάνω και δεν μπορώ να βρω τρόπο επίλυσης είναι το εξής:

    Έχω ένα DataGridView που περνάω τα στοιχεία της παραγγελίας. Product ,quantity, price, total price. Αυτό που θέλω να κάνω είναι, όταν διαλέγω το product απο το πεδίο Product (που το έχω κάνει combobox) να πηγαίνει και να καταγράφει αυτόματα στο πεδίο του price την τιμή που έχει το συγκεκριμένο product, ωστε ο χρήστης να καταχωρεί μόνο το quantity και να βγαίνει αυτόματα και το total price.

    Ευχαριστώ εκ των προτέρων

     

  •  03-06-2008, 11:48 42601 σε απάντηση της 42597

    Απ: Βοήθεια για DataGridView

    Το πρόβλημα που περιγράφεις είναι τόσο γενικό, που θα έπρεπε να γράψουμε ένα ολόκληρο κεφάλαιο βιβλίου ως προς το πως υλοποιείται το look-up functionality. Θα πρέπει να μας δώσεις περισσότερες πληροφορίες ως προς το πώς έχεις σχεδιάσει και δουλεύει το κομμάτι αυτό στο project σου.


    Vir prudens non contra ventum mingit
  •  03-06-2008, 12:13 42603 σε απάντηση της 42601

    Απ: Βοήθεια για DataGridView

    Αυτό που έχω κάνει μέχρι στιγμής, είναι ότι έφτιαξα μια φόρμα με ένα DataGridView και έχω bind του table OrderDetail το οποίο έχει σαν πεδία εξής:

     

    OrderDetailId

    OrderId

    ProductId

    Quantity

    Price

    TotalPrice

     

    Έχω φτιάξει το dataset του OrderDetail όπως επίσης και ένα LookUp dataset για τα products. Το table των Products έχει τα εξής πεδία:

     

    ProductId

    Description

    Price

     

    Αυτό που έκανα αργότερα είναι να ορίσω στο column ProductId του DataGridView σαν ComboBox και να κάνω bind στο DataSource το ProductLookUpBindingSource και βλέπω σωστά τα προϊόντα μου. Απο κεί και πέρα θέλω, όταν επιλέγω το Product μου, να καταχωρείτε η τιμή του Price του Product που επιλέγω στο column Price του DataGridView που αναφέρετε στο OrderDetail.

     

    Δεν ξέρω πάλι αν σας βοήθησα αλλά δε ξέρω πως μπορώ να το εξηγήσω αλλιώς....

     

    Ευχαριστώ...

  •  04-06-2008, 09:39 42616 σε απάντηση της 42603

    Απ: Βοήθεια για DataGridView

    Νομίζω οτι κάτι βρήκα αλλα δεν ξέρω αν είναι σωστή αυτή η προσέγγιση.

    Πήγα στο CellEndEdit event του DataGridView και έγραψα το εξής:

     

    Private Sub DataGridView_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellEndEdit

    Dim row As DataRow

    row = ProductLookUpDataSet.Tables("Products").Rows(ProductBindingSource.Position)

    Me.DataGridView.CurrentRow.Cells(2).Value = row("Price")

    End Sub

     

    Είναι σωστό??

  •  04-06-2008, 12:30 42624 σε απάντηση της 42616

    Απ: Βοήθεια για DataGridView

    Δουλεύει, ωστόσο από "φιλοσοφικής" άποψης δεν είναι και τόσο σωστό. Προτιμότερο είναι κάτι σαν το παρακάτω:

    CType(Order_DetailsBindingSource.Current, DataRowView).Item("Price") = _
                                  CType(ProductsBindingSource.Current, DataRowView).Item("Price")

    Η διαφορά με τον δικό σου κώδικα είναι ότι δεν δουλεύεις απευθείας πάνω στο DataGridView αλλά χρησιμοποιείς το BindingSource. Γενικά, καλό είναι να ακολουθήσεις αυτή τη φιλοσοφία και οποτεδήποτε πιάνεις τον εαυτό σου να κάνει απευθείας edit πάνω στα cells του DataGridView, να αλλάζεις τον κώδικά σου ώστε να χρησιμοποιεί το BindingSource.

    Ως προς το event που επέλεξες, είναι το καλύτερο που μπορείς να κάνεις χωρίς να μπλέξεις σε περιπέτειες καθώς το user experience δεν είναι και τόσο καλό. Όταν ο χρήστης αλλάζει την τιμή μέσω του ComboBox θα πρέπει να φύγει από το Cell για να την δει να περνάει στο Price. Το λογικό είναι με το που αλλάζει η τιμή στο ComboBox να βλέπει την αντίστοιχη τιμή στο Price, ωτόσο κάτι τέτοιο δεν υποστηρίζεται out-of-the-box με το DataGridViewComboBoxColumn του DataGridView. Θα πρέπει να υλοποιήσεις το δικό σου που... Αν παρουσιαστεί αυτή η ανάγκη, εδώ είμαστε...

    Τέλος, πέρα από το πρόβλημα σου, βλέπω ότι χρησιμοποιείς για κάθε πίνακα και διαφορετικό DataSet. Δεν είναι ανάγκη να το κάνεις έτσι, μπορείς να έχεις δύο (ή περισσότερα) DataTables μέσα στο ίδιο DataSet. Μάλιστα, όταν αυτά σχετίζονται με DataRelation μπορείς να υλοποιήσεις πολύ εύκολα σενάρια του τύπου "Φέρε τις παραγγελίες είχει αυτό το προϊόν"


    Vir prudens non contra ventum mingit
  •  04-06-2008, 12:49 42627 σε απάντηση της 42624

    Απ: Βοήθεια για DataGridView

    KelMan:

    Όταν ο χρήστης αλλάζει την τιμή μέσω του ComboBox θα πρέπει να φύγει από το Cell για να την δει να περνάει στο Price. Το λογικό είναι με το που αλλάζει η τιμή στο ComboBox να βλέπει την αντίστοιχη τιμή στο Price, ωτόσο κάτι τέτοιο δεν υποστηρίζεται out-of-the-box με το DataGridViewComboBoxColumn του DataGridView.

    Συμφώνω.... Μου πήρες αρκετές μέρες προσπάθειας και αναζήτησης για να βρώ λύση.... Τελικά το μόνο που καταφερα να κάνω και "κάνει" τι δουλειά που θέλω, είναι αυτό που πόσταρα προηγουμένως....

    Ευχαριστώ για τη βοήθεια και τις παρατηρήσεις...

     

  •  22-11-2008, 03:54 46414 σε απάντηση της 42624

    Απ: Βοήθεια για DataGridView

    KelMan:

    Δουλεύει, ωστόσο από "φιλοσοφικής" άποψης δεν είναι και τόσο σωστό. Προτιμότερο είναι κάτι σαν το παρακάτω:

    CType(Order_DetailsBindingSource.Current, DataRowView).Item("Price") = _
                                  CType(ProductsBindingSource.Current, DataRowView).Item("Price")

    Η διαφορά με τον δικό σου κώδικα είναι ότι δεν δουλεύεις απευθείας πάνω στο DataGridView αλλά χρησιμοποιείς το BindingSource. Γενικά, καλό είναι να ακολουθήσεις αυτή τη φιλοσοφία και οποτεδήποτε πιάνεις τον εαυτό σου να κάνει απευθείας edit πάνω στα cells του DataGridView, να αλλάζεις τον κώδικά σου ώστε να χρησιμοποιεί το BindingSource.

    Ως προς το event που επέλεξες, είναι το καλύτερο που μπορείς να κάνεις χωρίς να μπλέξεις σε περιπέτειες καθώς το user experience δεν είναι και τόσο καλό. Όταν ο χρήστης αλλάζει την τιμή μέσω του ComboBox θα πρέπει να φύγει από το Cell για να την δει να περνάει στο Price. Το λογικό είναι με το που αλλάζει η τιμή στο ComboBox να βλέπει την αντίστοιχη τιμή στο Price, ωτόσο κάτι τέτοιο δεν υποστηρίζεται out-of-the-box με το DataGridViewComboBoxColumn του DataGridView. Θα πρέπει να υλοποιήσεις το δικό σου που... Αν παρουσιαστεί αυτή η ανάγκη, εδώ είμαστε...

    Τέλος, πέρα από το πρόβλημα σου, βλέπω ότι χρησιμοποιείς για κάθε πίνακα και διαφορετικό DataSet. Δεν είναι ανάγκη να το κάνεις έτσι, μπορείς να έχεις δύο (ή περισσότερα) DataTables μέσα στο ίδιο DataSet. Μάλιστα, όταν αυτά σχετίζονται με DataRelation μπορείς να υλοποιήσεις πολύ εύκολα σενάρια του τύπου "Φέρε τις παραγγελίες είχει αυτό το προϊόν"



    Δεν μπορείς να το κάνεις πάντα ... Ειδικά αν έχεις αποφασίσεις να δουλέυεις με DataReaders. Μίας και μετά το κλείσιμο του connection δεν μπορούν να έχουν πρόσβαση στην βάση όπως κάνουν τα DataSets.
    Αν και παλαιότερα λέγαν ότι τα DataReaders είναι πιο αργά αυτό έχει αλλάξει και η διαφορές ταχύτητας είναι σπάνια αισθητές.
  •  22-11-2008, 23:00 46418 σε απάντηση της 42624

    Απ: Βοήθεια για DataGridView

    Εδώ συστήνει να δουλέψουμε με το EditingControlShowing event του DataGridView κι εδώ παρουσιάζει μια υλοποίηση για το TextChangedEvent του DataGridViewTextBoxColumn. Φαντάζομαι μια πρόχειρη υλοποίηση για συμπεριφορά ComboBox είναι η:

    private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
    if (e.Control is DataGridViewComboBoxEditingControl)
    {
    ((DataGridViewComboBoxEditingControl)e.Control).SelectedValueChanged += new EventHandler(DataGridView1_SelectedValueChanged);
    }
    }

    void DataGridView1_SelectedValueChanged(object sender, EventArgs e)
    {
    do something...
    }

    Περίεργος τρόπος, όμως, για να κάνεις ένα event να δουλέψει.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  23-11-2008, 06:29 46422 σε απάντηση της 46418

    Απ: Βοήθεια για DataGridView

    Νομίζω πως η λύση είναι πιο απλή στο παραπάνω πρόβλημα και δεν χρειάζεται να γίνονται αναφορές στο control της φόρμας.

    Ο κώδικας που θα γράψω παρακάτω όπως θα δείτε δεν αναφέρεται καθόλου στο DataGridView αλλά απλά μόνο στον μηχανισμό Binding. Επίσης αντί για Datatable χρησιμοποιώ BindingList και φυσικά ένα custom object Product με τα εξής properties. (Το ότι χρησιμοποιώ BindingList δεν σημαίνει ότι το DataTable δεν παίζει με την λύση αυτή.)

    • Name
    • Price
    • Quantity
    • ReadOnly TotalPrice (=Price*Quantity)

    Δημιουργούμε την φόρμα με ένα DataGridView και δύο BindingSources τα οποία θα κάνουν Bind σε δύο διαφορετικές λίστες BindingList(Of Product)

    Ας πούμε το πρώτο SelectedGridProductsBindingSource και το δεύτερο AvailableComboProductsBindingSource.

    Δεν θα αναφερθώ στο setup του grid με τα columns νομίζω τα γνωρίζουμε αυτά. Απλά θέλω να τονίσω ότι στο ValueMember του ComboBox δεν έχω βάλει τιμή, γιατί θέλω το ComboBox να μου επιστρέφει το object που επίλέχθηκε και όχι κάποια τιμή του.

    'Οταν λοιπόν ξεκινάμε το project η λίστα που δείχνει το SelectedGridProductsBindingSource θα είναι κενή, εφόσων δεν έχουμε επειλέξει ακόμα κάποιο προιόν, αντιθέτως η λίστα η οποία βλέπει το ComboBox μέσω του BindingSource φορτώνεται με όλα τα διαθέσιμα προιόντα.

    Στο τέλος με Addhandler κάνουμε subscribe στο event PositionChanged του AvailableComboProductsBindingSource και γράφουμε το εξής :

    SelectedGridProductsBindingSource.Item(SelectedGridProductsBindingSource.Position) = AvailableComboProductsBindingSource.current

    Αυτό που γίνεται είναι ότι μόλις επιλέξουμε κάποιο προιόν από το combobox αμέσως ενημερώνεται η τρέχουσα γραμμή του DataGridView με το προιόν που επιλέξαμε. (Δενχρειάζεται δηλαδή να βγούμε από το κελί για να δούμε τις αλλαγές)

    Ο κώδικας δεν αναφέρεται σε κανένα control οπότε ότι χρησιμοποιήσουμε στο UI και υποστηρίζει databinding θα παίξει μια χαρά. (Ουσιαστικά μπορούμε να φτιάξουμε μία γενική ρουτίνα και να την χρησιμοποιούμε σε όσα projects θέλουμε.)

    Νομίζω ότι είναι μία αρκετά καλή λύση.

  •  26-12-2008, 00:46 47157 σε απάντηση της 46422

    Απ: Βοήθεια για DataGridView

    Δεν δοκίμασα την πρότασή σου, αλλά πρέπει να δουλεύει. Για τις ανάγκες ενός δικού μου project χρειάζεται να υλοποιήσω μια λύση τύπου cascade comboboxes σε datagridview. Μπορεί η απάντησή μου να είναι ελαφρώς off topic, αλλά μιας και μιλάμε για το τι μπορεί να γίνει και τι δε μπορεί να γίνει με τα build-in controls του datagridview, ίσως αυτό να το βρείς ενδιαφέρον. Αναφέρεται ακριβώς στο πρόβλημά μου. Λογικά και η δική σου πρόταση μπορεί να έχει εφαρμογή με την ανάλογη τροποποίηση. Θα τα κοιτάξω όλα μετά τις γιορτές.


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