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

 

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

Πρόβλημα σε Update με DevExpress

Îåêßíçóå áðü ôï ìÝëïò pap. Τελευταία δημοσίευση από το μέλος Johnnyxp64 στις 07-10-2008, 22:24. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-10-2008, 11:59 45209

    Πρόβλημα σε Update με DevExpress

    Καλημέρα.

    Στο project που κάνω (με .net 2.0), δουλεύω με μία κύρια φόρμα, με user controls (αμάν με αυτά τα user controls...Smile)και με classes οι οποίες κάνουν τις λειτουργίες σχετικές με την database. Στην κύρια φόρμα υπάρχει ένα toolbar το οποίο έχει επιλογές για προσθήκη, διαγραφή, ανανέωση (refresh) επαφών, εργασιών, σημειώσεων κτλ. Η προσθήκη και η διαγραφή μου δουλεύουν μια χαρά, ενώ το refresh δε λειτουργεί καθόλου, σαν να μη τρέχει καθόλου το event. Nα σημειώσω ότι δουλεύω με controls της DevExpress. Έχω λοιπόν την κλάση Contact (o κώδικας περιέχει μόνο τα "κομμάτια" που αφορούν το πρόβλημα):

    // Default constructor

    private SqlDataAdapter da = new SqlDataAdapter();
    private SqlCommand selectCommand = new SqlCommand();
    private SqlCommand updateCommand = new SqlCommand();
    private DataSet ds = new DataSet();

    public Contact() {
                //
                // selectCommand
                //
                selectCommand.CommandText = @"
    SELECT *
    FROM Contact";
                selectCommand.Connection = Database.Con;


                //
                // updateCommand
                //
                updateCommand.CommandText = @"
    UPDATE Contact SET firstName = @firstName, lastName = @lastName, middleName = @middleName, prefix = @prefix,
     homePhone = @homePhone, workPhone = @workPhone, mobilePhone = @mobilePhone, company = @company, position = @position,
     personalEmail = @personalEmail, workEmail = @workEmail, homePage = @homePage, city = @city, address = @address, zipCode = @zipCode, birthday = @birthday,
     personalPhone1 = @personalPhone1, personalPhone2 = @personalPhone2, personalMobile1 = @personalMobile1, personalMobile2 = @personalMobile2,
     msn = @msn, notes = @notes
    WHERE
     contactId = @contactId";
                updateCommand.Connection = Database.Con;
                updateCommand.Parameters.Add( "@contactId", SqlDbType.Int, 0, "contactId" );
                updateCommand.Parameters.Add( "@lastName", SqlDbType.VarChar, 30, "lastName" );
                updateCommand.Parameters.Add( "@firstName", SqlDbType.VarChar, 30, "firstName" );
                updateCommand.Parameters.Add( "@middleName", SqlDbType.VarChar, 30, "middleName" );
                updateCommand.Parameters.Add( "@prefix", SqlDbType.VarChar, 5, "prefix" );
                updateCommand.Parameters.Add( "@homePhone", SqlDbType.VarChar, 10, "homePhone" );
                updateCommand.Parameters.Add( "@workPhone", SqlDbType.VarChar, 10, "workPhone" );
                updateCommand.Parameters.Add( "@mobilePhone", SqlDbType.VarChar, 10, "mobilePhone" );
                updateCommand.Parameters.Add( "@company", SqlDbType.VarChar, 30, "company" );
                updateCommand.Parameters.Add( "@position", SqlDbType.VarChar, 30, "position" );
                updateCommand.Parameters.Add( "@personalEmail", SqlDbType.VarChar, 30, "personalEmail" );
                updateCommand.Parameters.Add( "@workEmail", SqlDbType.VarChar, 30, "workEmail" );
                updateCommand.Parameters.Add( "@homePage", SqlDbType.VarChar, 30, "homePage" );
                updateCommand.Parameters.Add( "@city", SqlDbType.VarChar, 30, "city" );
                updateCommand.Parameters.Add( "@address", SqlDbType.VarChar, 30, "address" );
                updateCommand.Parameters.Add( "@zipCode", SqlDbType.Int, 0, "zipCode" );
                updateCommand.Parameters.Add( "@birthday", SqlDbType.DateTime, 0, "birthday" );
                updateCommand.Parameters.Add( "@personalPhone1", SqlDbType.VarChar, 10, "personalPhone1" );
                updateCommand.Parameters.Add( "@personalPhone2", SqlDbType.VarChar, 10, "personalPhone2" );
                updateCommand.Parameters.Add( "@personalMobile1", SqlDbType.VarChar, 10, "personalMobile1" );
                updateCommand.Parameters.Add( "@personalMobile2", SqlDbType.VarChar, 10, "personalMobile2" );
                updateCommand.Parameters.Add( "@msn", SqlDbType.VarChar, 30, "msn" );
                updateCommand.Parameters.Add( "@notes", SqlDbType.Text, 0, "notes" );
      
                
                //
                // da (Data Adapter)
                //
                da.SelectCommand = selectCommand;
                da.UpdateCommand = updateCommand;
                // fill dataset
                da.Fill( ds, "Contact" );
            }

    /// <summary>
    /// Executes UPDATE command to the database.
    /// </summary>
    public void Update() {
         da.Update( ds.Tables["Contact"] );
    }

    Στο user control έχω αυτό το κομμάτι:

    public void UpdateGridView() {
        contact.Update();
    }

    Και στην mainForm έχω το event που καλεί την UpdateGridView():

    ...

    OP.User_Controls.ucContact uc_Contact = new OP.User_Controls.ucContact();

    ...

    private void barLargeButtonItemRefresh_ItemClick( object sender, DevExpress.XtraBars.ItemClickEventArgs e ) {
                try {
                    uc_Contact.UpdateGridView();
                 }
                catch (Exception ex) {
                    MessageBox.Show( "Αποτυχία ενημέρωσης της βάσης δεδομένων (Σφάλμα: " + ex.Message +
                            " )", "Σφάλμα", MessageBoxButtons.OK, MessageBoxIcon.Error );
                }
            }

    Όλως περιέργως στο .net 1.1 ακριβώς το ίδιο παράδειγμα δουλεύει μια χαρά με απλά User Controls (όχι DevExpress).

    Αναρωτιέμαι τώρα.... Τι φταίει; Φταίνε τα controls της DevExpress; Φταίει το .net 2.0;

  •  07-10-2008, 17:29 45227 σε απάντηση της 45209

    Απ: Πρόβλημα σε Update με DevExpress

    Αν και δεν το αναφέρεις, υποθέτω πως όταν ξεκινάει η εφαρμογή σου φέρνεις μέσα στο Grid, όλες ή κάποιες από τις επαφές που βρίσκονται στην βάση. Σωστά;

    Δεν νομίζω ότι είναι πρόβλημα τις DevExpress ή του .Net 2.0. Μάλλον κάτι άλλο γίνεται. Μίλησες για Refresh αλλά μας δείχνεις το Update. Αυτά δεν είναι το ίδιο. Άλλο Refresh να πάρω τι καινούριο έχει η βάση μου και άλλο Update σε μία εγγραφή που έχω κάνει αλλαγές. Αν περιμένεις από την παραπάνω Update που βλέπω το Grid να σου δείξει και ότι άλλες εγγραφές έχουν αλλάξει στην βάση τότε αυτό δεν θα γίνει και απορώ πως αυτό γινόταν στο .Net 1.1 Ίσως εκεί να καλούσε αυτόματα μετά το Update ένα SELECT * αλλά στο 2.0 αυτό να μην υπάρχει. Αυτή είναι η μόνη λογική εξήγηση που μπορώ να δώσω τώρα.

  •  07-10-2008, 18:08 45230 σε απάντηση της 45209

    Απ: Πρόβλημα σε Update με DevExpress

    οντος αλλο update και αλλο refresh

    τι ενοεις εσυ refresh?ποια εκδοση devexpress exeis? 8.4.2?

    παραδειγμα στο devexpress xtragrid οταν κανεις refresh κανει ανανεωση οτι controls kai objects περιλαμβανει, οταν ομως λες update ζητας να κανει update κανει update τα records!

    ενα δικο μου παραδειγμα:

    1
    2
    3
            Grid.DataSource = MyDataTable  'klasika edo diloneis oti to grid pernei dedomena apo to datatable p.x MyDataTable
    Grid.RefreshDataSource() 'edo koitas an eginan ta update pou itheles stin vasi!
    Grid.Refresh() 'edo kaneis refresh (den tha dixei aparetita ta updated records)


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  07-10-2008, 20:47 45233 σε απάντηση της 45230

    Απ: Πρόβλημα σε Update με DevExpress

    Ουπς....

    Σωστά λέτε δε διευκρίνησα. Refresh απλά λέγεται το κουμπί της ενημέρωσης, δηλαδή του update.

    Λοιπόν δεν έχει να κάνει όντως με τα DevXpress, παρατήρησα το εξής "κουφό":

    Βάζω ένα απλό button στην φόρμα. Πατάω εν συνεχεία σε runtime αυτό το button και κάνει update τις δύο εγγραφές που έχω αλλάξει. Ωραία μέχρι εδώ... Όταν όμως πατήσω το κουμπί που έχω στο toolbar ("Refresh") ενημερώνει μόνο μία εγγραφή, και συγκεκριμένα την πρώτη που άλλαξα!

    Aν πάλι αλλάξω μόνο μία εγγραφή και πατήσω το button του toolbar δεν αλλάζει ΤΙΠΟΤΑ!

    Δεν είναι κουφό???

  •  07-10-2008, 20:54 45234 σε απάντηση της 45233

    Απ: Πρόβλημα σε Update με DevExpress

    οπα κατσε, μας λες οτι αντιγραφη ο κωδικας παιζει και εμφανιζει σωστα αποτελεσματα σε ενα απλο κουμπι αλλα στην "μπαρα" σου οχι?

    κανε κι εσυ ενα αλλο κουφο και δες τι κανει, ασε τον κωδικα στο button1.click

    και στο refresh "κουμπακι" in toolbar γραψε butto1.performclick! αμα αυτο παιξει, τοτε ειναι κουφο.........Zip it!

    σιγουρα δεν εχεις κατι διαφορετικο καμια φορα οταν ειμαστε κουρασμενει δεν βλεπουμε τα λαθη μας κι ας ειναι μπροστα μας!


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  07-10-2008, 21:03 45236 σε απάντηση της 45234

    Απ: Πρόβλημα σε Update με DevExpress

    Λοιπόν φίλε με έσωσες παίζει με το button.PerformClick()! Πραγματικά, για να δεις ότι όντως συμβαίνει αυτό δοκίμασε το πρόχειρα (αν έχεις χρόνο φυσικά) πχ. με τον κώδικα που έδωσα παραπάνω φτιάξε μια db με 3 πεδία και test it. 2 μέρες ασχολούμαι με αυτό έχω φρίξει!!!

    Σε ευχαριστώ θερμά.

  •  07-10-2008, 21:11 45237 σε απάντηση της 45236

    Απ: Πρόβλημα σε Update με DevExpress

    pap:

    Λοιπόν φίλε με έσωσες παίζει με το button.PerformClick()! Πραγματικά, για να δεις ότι όντως συμβαίνει αυτό δοκίμασε το πρόχειρα (αν έχεις χρόνο φυσικά) πχ. με τον κώδικα που έδωσα παραπάνω φτιάξε μια db με 3 πεδία και test it. 2 μέρες ασχολούμαι με αυτό έχω φρίξει!!!

    Σε ευχαριστώ θερμά.

    TI?? ΕΠΑΙΞΕ?!!!! αυτε οι toolbar ειναι "κλαην μαην" εχω τραβιξει κι εγω πολλα, να εξαφανιζονται μονες τους, και τετοια!

    χαρα μου που δουλεψε μην ξεχασεις κανε, HIDE το button αυτο που δουλευει!Stick out tongueWink


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  07-10-2008, 21:33 45240 σε απάντηση της 45237

    Απ: Πρόβλημα σε Update με DevExpress

    Ναι όντως εξαφανίζονται ως δια μαγείας με ένα κλικ, αλλά υπάρχουν από πίσω και αν πας να δώσεις ίδιο όνομα σου λέει το κλασικό "Property is not valid"....Super Angry

    Τώρα αν το κάνω Visible = false (σε design-time) δε δουλεύειCrying Θα το δοκιμάσω με event άλλου Control να δω...

    Το θέμα είναι ότι συμβαίνει όχι μόνο στο toolbar της DevExpress αλλά και στο default του .Net μου κάνει τα ίδια. Αρχίζω να πιστεύω ότι είναι bug του VS...

  •  07-10-2008, 21:50 45243 σε απάντηση της 45233

    Απ: Πρόβλημα σε Update με DevExpress

    Χαίρομαι που σου δούλεψε, νομίζω όμως ότι καλύτερα να σου εξηγήσω τι συνέβει στον κώδικά σου και για να ξέρεις και εσύ.

    Το Grid σου βλέπει τις εγγραφές που έχεις στο DataTable σου μέσα από ένα μηχανισμό ο οποίος λέγεται DataBinding. Ο σκοπός μου εδώ δεν είναι να σου παρουσιάσω ακριβώς πως παίζει ο μηχανισμός αυτός, άλλωστε έχουν γραφτεί και γράφονται πάρα πολλά για αυτόν. Με απλές λέξεις, φέρνει τα δεδομένα σου από ένα DataSource, στην περίπτωσή μας το DataTable που έχεις, στα UI controls που χρησιμοποιείς και ανάποδα. Τα δεδομένα από τα UI controls στα DataSources. Όταν εσύ καλείς την Insert, Update, Delete αυτά γίνονται στο DataSource και όχι πάνω από το Grid. Το Grid απλά δείχνει συγχρονίζεται με το DataSource για να δείξει τι έχει.

    Το βασικό ερώτημα τώρα είναι πότε τα δεδομένα μου από τα controls καταλήγουν στο DataSource. Δηλαδή αν εγώ είμαι μέσα σε ένα κελί του Grid πότε η τιμή που έχω βάλει θα πάει στο αντίστοιχο Record και πεδίο του DataSource. Ο μηχανισμός DataBinding σου προσφέρει τρεις επιλογές.

    • OnValidation (Default)
    • OnpropertyChanged (Όταν αλλάξουμε τιμή και φύγουμε από το Control)
    • Never (Επιλέγουμε εμείς πότε θα ενημερώσουμε το DataSource)

    Στην ουσία το πρώτο και το δεύτερο βήμα, αλληλοκαλύπτονται αφού όποτε αλλάζουμε focus το control γίνεται validate.

    Όταν λοιπόν εσύ είσαι μέσα σε ένα κελί και γράψεις κάτι στο DataSource δεν καταλήγει τίποτα. Ο λόγος για τον οποίο σου τρέχει βάζοντας ένα κουμπί πάνω στην φόρμα είναι γιατί αυτά τα Buttons μπορούν να γίνουν focus σε αντίθεση με τα Buttons σε Toolbars που δεν μπορούν να γίνουν. Οπότε αλλάζοντας focus γίνεται validate το κελί πέρνει to focus το κουμπί που πάτησες και εκτελείτε ο κώδικας που έχεις γράψει. Το ίδιο όμως δεν μπορεί να γίνει με buttons που βάζεις στις μπάρες γιατί αυτά δεν έχουν focus με αποτέλεσμα ο κέρσορας να μην φεύγει ποτέ μέσα από το κελί.

    Τι κάνουμε λοιπόν όταν έχουμε μία τέτοια περίπτωση. Στο κουμπί τις Toolbar που έχεις βάλει να γράψεις Me.Validate πριν τρέξεις το update σου για να ενημερωθεί το DataSource με τις αλλαγές που έχεις κάνει και να βγάλεις το έξτρα button που έβαλες. Όσο για το τι κάνει η Validate. Απλά τρέχει το validation routine σε όλα τα controls. Ο μηχανισμός του BindingSource παρακολουθεί αν το κελί control κτλ, γίνει validate και ταυτόχρονα στέλνει τα νέα δεδομένα στο DataSource. Οπότε μετά μπορείς να τρέξεις το update που θέλεις να κάνεις.

    Φυσικά μπορείς να μείνεις με αυτό που έκανες αλλά να ξέρεις υπάρχει άλλος δρόμος όχι απλά πιο σωστός αλλά φτιάχτηκε για αυτό το σκοπό.

  •  07-10-2008, 22:03 45245 σε απάντηση της 45243

    Απ: Πρόβλημα σε Update με DevExpress

    Α, τώρα κατάλαβα. Δεν είχα ιδέα.

    Λοιπόν η λύση σου είναι άψογη, έγραψα ένα this.Validate() πριν την κλήση του update και παίζει στράφι!

    Σε ευχαριστώ πολύ.

  •  07-10-2008, 22:24 45246 σε απάντηση της 45243

    Απ: Πρόβλημα σε Update με DevExpress

    ---update:πανω που εγραφα τα παρακατω μαλλον ακουσες το φιλο και το βρηκες.Wink

    γενικα το σωστο ειναι να βρεις την πραγματικη αιτια οπως λεει και ο infoCenter και να το φτιαξεις αυτο που καναμε πριν ειναι μια πατεντα για την αναγκη, 

    θα εχεις προβληματα και στο μελλον, οποτε παιζει να ειναι το προβλημα στο validate. 


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems