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

 

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

DataGridView (VB 2005) - Προβλημα στο Refresh

Îåêßíçóå áðü ôï ìÝëïò DeClen. Τελευταία δημοσίευση από το μέλος DeClen στις 19-01-2007, 14:48. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-01-2007, 10:20 23745

    DataGridView (VB 2005) - Προβλημα στο Refresh

    Καλημέρα.

    Τις τελευταίες μέρες δουλεύω με ένα DataGridView. Πριν αναφέρω το πρόβλημα που αντιμετωπίζω παραθέτω τον κώδικα (τα σχετικά κομμάτια) που χρησιμοποιώ.

    Στο Load της φόρμας κάνω bind το DataGridView με ένα instance ενός TableAdapter από ένα DataSet που έχω προσθέσει στο solution και προσθέτω στο αντικείμενο μια Button Column. Πάνω στη φόρμα έχω βάλει και ένα BindingSource αντικείμενο με όνομα myBind. Επίσης το όνομα του DataGridView είναι myGrid.

    Private Sub mainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'POPULATING RECORDS FROM DATASET TO A DATAGRIDVIEW
            '=================================================
            'creating instances of myDataSet class objects
            Dim myCompanies As New myDataSetTableAdapters.EtairiaTableAdapter()
          
            'bind BindingSource object with data
            myBind01.DataSource = myCompanies.GetEtairies()
            'bind DataGridView object
            myGrid.DataSource = myBind01
            'ADD A BUTTON COLUMN TO THE DATAGRID VIEW
            '========================================
            'declare variables
            Dim actionsColumn As New DataGridViewButtonColumn()
            'set buttons properties
            actionsColumn.HeaderText = "Customers"
            actionsColumn.Name = "myButton"
            actionsColumn.Text = "view"
            actionsColumn.UseColumnTextForButtonValue = True
            actionsColumn.DefaultCellStyle.BackColor = System.Drawing.Color.Silver
            'add column
            myGrid.Columns.Add(actionsColumn)
            myGrid.Refresh()
            'SET NAVIGATOR'S BINDING SOURCE
            '==============================
            myNavigator.BindingSource = myBind01
        End Sub


    Πάνω στη φόρμα έχω και ένα κουμπάκι Refresh για να ανανεώνω το DataGridView σε περίπτωση που του περάσω διάφορα φίλτρα μελλοντικά κτλ. Ο κώδικας πίσω από το button είναι.

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
           'refresh grid
            Dim myCompanies As New myDataSetTableAdapters.EtairiaTableAdapter()
            myBind01.DataSource = myCompanies.GetEtairies()
            myNavigator.BindingSource = myBind01
        End Sub


    Για τεστάρισμα, όταν πατάω κάποιο κουμπί από την νέα button column του DataGridView μου επιστρέφονται σε ένα MsgBox οι συντεταγμένες του κελιού, ούτως ώστε να μπορώ να τις χρησιμοποιήσω μελλοντικά για να πέρνω κάποιες τιμές από τα κελιά.

     Private Sub myGrid_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles myGrid.CellEnter
            'HANDLES THE BUTTON COLUMN CLICK EVENT
            '=====================================
            'find the row index of the selected cell
            Dim sel_row_index As Integer = myGrid.CurrentCellAddress.Y
            'find the column index of the selected cell
            Dim sel_col_index As Integer = myGrid.CurrentCellAddress.X
           If myGrid.Columns(e.ColumnIndex).Name = "myButton" Then
                MsgBox(sel_row_index & " - " & sel_col_index)
            End If
        End Sub


    Το πρόβλημα τώρα πιο είναι. Όταν κάνει load η φόρμα και πατήσω το "view" κουμπί στο MsgBox μου επιστρέφονται κανονικά οι συντεταγμένες του κελιού. Όταν πατίσω το Refresh κουμπί και ξανακάνω την ίδια διαδικασία μου επιστρέφεται κανονικά η συντεταγμένη Y του κελιού (δηλαδή το row) αλλά το X (δηλαδή το column) μου δίνει την τιμή 0.

    Από αυτό συμπεραίνω ότι μάλλον κάτι δεν πάει καλά με το Refresh. Το παλέυω 4 μέρες τώρα αλλά δεν κατάφερα να βρω μια άκρη.Sad

    Έχετε καμμιά ιδέα; Confused

  •  19-01-2007, 10:50 23748 σε απάντηση της 23745

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    Μήπως κάτι άλλο συμβαίνει; Εμένα δεν μου παρουσιάζει κανένα πρόβλημα ο κώδικας. Και πριν το refresh και μετά από το refresh, πάντοτε βγαίνει το σωστό Χ και Υ, αρκεί βέβαια να έχει πάρει το focus το DataGridView, διαφορετικά σου δείχνει το τελευταίο X και Y που είχε. Μπορεί κάτι τέτοιο να σου συμβαίνει.

    Πάντως, το event που χρησιμοποιείς για να δείχνει το MessageBox γίνεται trigger ακόμα και αν απλά κάνεις navigate (πχ με ΤΑΒ) στο συγκεκριμένο πεδίο και όχι μόνο με το click του Button.

    Επίσης, μπορείς να αποφύγεις του rebinding που κάνεις για refresh αν δουλέψεις με Fill και όχι GetData ώστε να έχεις έναν σταθερό πίνακα πάνω στον οποίο μπορείς να ρίχνεις τα data σου. Αυτόματα θα τα βλέπεις στο DataGridView. Επιπρόσθετα, αν φιλτράρεις και ταξινομείς τα δεδομένα μέσα από το BindingSource και πάλι δεν θα χρειάζεται rebinding.
    Vir prudens non contra ventum mingit
  •  19-01-2007, 11:29 23753 σε απάντηση της 23748

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    Για το event έχει δίκιο. Βασικά "ξέμεινε" από τις προσπάθειες που έκανα για να λύσω το πρόβλημα. Θα περάσω τον κώδικα στο CellContentClick.

    Δοκιμαστικά αφαίρεσα το if statement από τον κώδικα και είδα ότι τα άλλα X,Y μετά το Refresh μου τα επιστρέφει κανονικά. Το πρόβλημα είναι ότι "νομίζει" πως η button στήλη μετά το Refresh "μεταφέρεται" στην αρχή του Grid και την βλέπει ως column 0 (οπτικά βέβαια η στήλη είναι στο τέλος του grid). Θα προσπαθήσω να εφαρμόσω αυτά που μου συνέστησες και θα επιστρέψω.

  •  19-01-2007, 12:07 23757 σε απάντηση της 23753

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    Γιατί να χρησιμοποιείς το CurrentCellAddress όταν τα DataGridViewCellEventArgs περιέχουν ωραιότατα properties που λέγονται RowIndex και ColumnIndex;

    Νατάσα Μανουσοπούλου
  •  19-01-2007, 12:16 23758 σε απάντηση της 23753

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    ...προσπαθώντας να δουλέψω με την Fill() έκανα το παρακάτω...

            Dim mySet As myDataSet = New myDataSet()
            Dim myComp As New myDataSetTableAdapters.EtairiaTableAdapter()
            myComp.Fill(mySet.Etairia)
            myBind01.DataSource = myComp
            myGridView1.DataSource = myBind


    ...στο Grid μου ήρθε ένα cell με ένα Header ClearBeforeFill και ένα check box... Embarrassed
  •  19-01-2007, 12:19 23759 σε απάντηση της 23757

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

     mns wrote:
    Γιατί να χρησιμοποιείς το CurrentCellAddress όταν τα DataGridViewCellEventArgs περιέχουν ωραιότατα properties που λέγονται RowIndex και ColumnIndex;


    Σε ευχαριστώ. Θα δοκιμάσω και αυτά τα properties.
  •  19-01-2007, 12:23 23761 σε απάντηση της 23758

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    Χε χε χε... Καλό, δεν το ήξερα ότι ο TableAdapter είναι bindable!

    Πρέπει να κάνεις bind το BindingSource όχι στον TableAdapter (myComp) αλλά στο DataTable. Δηλαδή:

    myBind01.DataSource = mySet

    myBind01.DataMember = "{tablename}"


    Vir prudens non contra ventum mingit
  •  19-01-2007, 14:48 23773 σε απάντηση της 23761

    Απ: DataGridView (VB 2005) - Προβλημα στο Refresh

    @ KelMan

    Έχεις δίκιο για τον bindable TableAdapter...  Μερικές φορές κάνω ότι να 'ναι! Confused
    Σ'ευχαριστώ πάντως για την ιδέα του Fill() έναντι του GetData(). Με βοήθησε να απλοποιήσω πολύ τον κώδικά μου.Smile

    @mns

    Το tip για τα RowIndex και ColumnIndex ήταν ότι ιδιαίτερα χρήσιμο. 5-6 γραμμές κώδικα μεταράπηκαν σε 1 απλή γραμμή!

    Τελικά παιδιά την βρήκα την άκρη. Η αλήθεια είναι πως δεν μπορούσα να βρω λύση. Μέχρι και καινούργιο project-άκι από την αρχή έκανα (...κλασσικές πρακτικές απελπισίας!) Indifferent

    Λίγο πριν φτάσω στο σημείο να σπάσω την οθόνη μου ήρθε η ιδέα να κοιτάξω και τον κώδικα του designer. Τελικά από εκεί μέσα και μέσω διάφορων αλχημιστικών διεργασιών είδα ένα property που λεγόταν AutoGenerateColumns. Δεν ξέρω πως μου ήρθε αλλά πήγα στο σημείο που έφτιαχνα την ButtonColumn του Grid και αμέσως μετά την γραμμή

    'add new column
    myGrid.Columns.Add(actionsColumn)


    πρόσθεσα

    'add new column
    myGrid.Columns.Add(actionsColumn)
    myGrid.AutoGenerateColumns = False


    Κάνοντάς το αυτό το Grid μου επιτέλους κατάλαβε πως μετά το Refresh, το Column που βρίσκεται στο τέλος... παραμένει εκεί!

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