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

 

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

DataGridView Refresh

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

    Geeked [8-|] DataGridView Refresh

    Καλημέρα και καλή χρονιά
    'Εχω το εξής πρόβλημα
    Έχω ένα BindingSource συνδεδεμένο με μία Dataset και ένα table στην DataSet πχ "ΤΙΜ1" και ένα DataGridView
            BindingSource1.DataSource = m_DataSet
            BindingSource1.DataMember = "TIM1"
            BindingNavigator1.BindingSource = BindingSource1
            DataGridView1.DataSource = BindingSource1

    Πώς θα αλλάζη το DataGridview ανάλογα του DataTable ???
    Πχ Διαγράφω DataTable από την Dataset, ξαναγεμίζω το DataTable με διαφορετικό Filter το προσθέτω στην DataSet και θέλω να μου εμφανίση το DataGridView1 τις νέες τιμές
    Δηλ. πως κανω refrech to DataGridView1
    Δοκίμασα
      BindingSource1.ResetBindings(False)
      DataGridView2.Refresh()
    Αλλά δεν μου δούλεψε
    Πρέπει να χαναδώσω ???
            BindingSource1.DataSource = m_DataSet
            BindingSource1.DataMember = "TIM1"
            BindingNavigator1.BindingSource = BindingSource1
            DataGridView1.DataSource = BindingSource1
    Αλλά και αυτό να κάνω το DataGridView δεν αλλάζη (δυστυχώς)


    Ευχαριστώ


    George Matzouranis
  •  10-01-2007, 12:55 23307 σε απάντηση της 23306

    Απ: DataGridView Refresh

    Συνημμένα: DataGridViewTest.zip

     gmlogic wrote:

    Πχ Διαγράφω DataTable από την Dataset, ξαναγεμίζω το DataTable με διαφορετικό Filter το προσθέτω στην DataSet και θέλω να μου εμφανίση το DataGridView1 τις νέες τιμές
    Δηλ. πως κανω refrech to DataGridView1

    Αυτό πως ακριβώς το κάνεις; Πιθανότατα αυτό που κάνεις χαλάει το binding. Ο πιο σωστός τρόπος είναι να ορίσεις ένα δεύτερο query στον TableAdapter ή το αρχικό σου query να είναι παραμετρικό. Κάθε φορά που θα κάνεις Fill στο DataTable θα φαίνονται αμέσως οι αλλαγές στο DataGridView, δεν χρειάζεται να διαγράψεις το DataTable και να το προσθέσεις εκ νέου στο DataSet. Ρίξε μια ματιά στο demo που έχω επισυνάψει.


    Vir prudens non contra ventum mingit
  •  10-01-2007, 13:55 23312 σε απάντηση της 23306

    Απ: DataGridView Refresh

    Αγαπητέ Μάνο

    Έχω μία class για τα Data GmData (με τήν δικιά σας βοήθεια)

    Μέσα σε αυτή τη class γεμίζω το table

    Δηλ.

    Private df As GmData

    df = New GmData(sysDB, CONNECT_STRING)

    m_DataSet = New DataSet

    sSQL = "SELECT * FROM TIM1 where pelpro=1"

    df.GmFillDataSet(m_DataSet, df.GmFillTable(sSQL, "TIM1"), "TIM1")

    και μετά

    BindingSource1.DataSource = m_DataSet

    BindingSource1.DataMember = "TIM1"

    BindingNavigator1.BindingSource = BindingSource1

    DataGridView1.DataSource = BindingSource1

    και θέλω όταν αλλάζη το sSQL να δίνη τις νέες τιμές στο DataGridView

    ..........

    Public Function GmFillDataSet(ByRef m_ds As DataSet, ByVal m_dt As DataTable, ByVal table_name As String) As Boolean

    Try

    If Not m_ds.Tables.Item(table_name) Is Nothing Then

    m_ds.Tables.Remove(table_name)

    m_ds.Tables.Add(m_dt)

    Else

    m_ds.Tables.Add(m_dt)

    End If

    Catch ex As Exception

    MsgBox("GmFillDataSet" & ex.Message, , "GmError")

    End Try

    End Function

    Public Function GmFillTable(ByVal select_statement As String, ByVal table_name As String) As DataTable

    tblname = table_name

    Dim conn As DbConnection = mdataFactory.CreateConnection()

    conn.ConnectionString = mConnectionString

    Dim da_Sql As DbDataAdapter = mdataFactory.CreateDataAdapter()

    da_Sql.SelectCommand = conn.CreateCommand()

    da_Sql.SelectCommand.CommandText = select_statement

    ' Map the default table name "Table" to

    ' the table's real name.

    Dim ft As DataTable

    ft = New DataTable

    ft.TableName = tblname

    ' Load the Table.

    Try

    da_Sql.Fill(ft)

    Catch ex As Exception

    MsgBox(ex.Message)

    ft = Nothing

    End Try

    Return ft

    End Function


    George Matzouranis
  •  10-01-2007, 14:16 23317 σε απάντηση της 23312

    Απ: DataGridView Refresh

    Ακριβώς. Όταν κάνεις Remove το DataTable (στην function GmFillDataSet) χάνονται τα bindings οπότε ο μόνος τρόπος για να δείξει το DataGridView τα data είναι να ξαναορίσεις DataSources κλπ. Είδες το demo; Θα πρέπει να κάνεις κάτι ανάλογο.
    Vir prudens non contra ventum mingit
  •  10-01-2007, 14:24 23318 σε απάντηση της 23306

    Απ: DataGridView Refresh

    Ναι το είδα και σε ευχαριστώ.

    Πρόσεξα ότι γεμιζη το datatable από τον ίδιο dataAdapter εγώ έχω

    Dim da_Sql As DbDataAdapter = mdataFactory.CreateDataAdapter()

    ..................................

    Όταν δίνω αυτό

    m_dvTim1 = New DataView(m_DataSet.Tables("TIM1"))

    BindingSource2.DataSource = m_dvTim1

    Δουλεύει


    George Matzouranis
  •  10-01-2007, 20:46 23338 σε απάντηση της 23306

    Απ: DataGridView Refresh

    Πιστεύεις ότι πρέπει να το κάνω με DataView?

    Και αν θέλεις πές μου πως θα έχω το query να είναι παραμετρικό σύμφωνα με την πρώτη σου απάντηση.

    Ευχαριστώ


    George Matzouranis
  •  10-01-2007, 23:08 23346 σε απάντηση της 23338

    Απ: DataGridView Refresh

    Αν έχω καταλάβει καλά, δουλεύεις σε .NET 2.0 οπότε δεν χρειάζεται να παίξεις με DataView. Την ίδια δουλειά μπορείς να κάνεις με το Filter property του BindingSource. To "αν θα πρέπει" εξαρτάται... Ο ένας τρόπος είναι να φορτώνεις όλα τα data και θέτοντας το Filter property σε διάφορες τιμές να αλλάζεις αυτά που βλέπει ο χρήστης. Πλεονεκτήματα: Εύκολο στην υλοποίηση και γρήγορο refresh του DataGridView καθώς δεν έχεις refetch από τον server. Μειονέκτημα: Αν είναι πολλά τα data θα αργήσει να τα φορτώσει αρχικά και γενικά θα έχεις πάντοτε στη μνήμη πολύ περισσότερα data απ'όσα χρειάζεσαι. Από την άλλη εξαρτάται και το τι θες να κάνεις, πως φτιάχνεις τη λειτουργικότητα της εφαρμογής. Δηλαδή αν θες να φέρεις τις παραγγελίες ενός πελάτη σε μια φόρμα, συνήθως δεν τραβάς όλες τις παραγγελίες για να τις φιλτράρεις στον client και να αφήσεις μόνο του πελάτη που σε ενδιαφέρει, τραβάς εκ των προτέρων μόνο αυτές που σε ενδιαφέρουν. Από την άλλη, αν έχεις όλα τα προϊόντα και θέλεις να τα φιλτράρεις μερικές φορές, καλύτερα να τα έχεις όλα και να βάζεις φίλτρα.

    Για να φτιάξεις ένα parameterized query, θα πρέπει όταν δηλώσεις το query να το γράψεις ανάλογα:

    SELECT * FROM TIM1 where pelpro=@pelpro

    Το @pelpro είναι η παράμετρός σου και πριν κάνεις το Fill, θα πρέπει να δώσεις τιμή. Όπως γίνεται και με τις stored procedures. O κώδικας που παράγει ο designer είναι παρόμοιος με τον παρακάτω:


    Dim sSqlCmd As String = "SELECT * FROM Products WHERE ProductID = @ProductID"
    Dim SqlCon As SqlConnection = New SqlConnection("......")
    Dim SqlCmd As SqlCommand = New SqlCommand(sSqlCmd, SqlCon)
    SqlCmd.Parameters.Add(New SqlParameter("@ProductID", SqlDbType.Int))
    SqlCmd.Parameters("@RecordCount").Value = 12345
    SqlCon.Open
    Dim SqlDr As SqlDataReader = SqlCmd.ExecuteReader

     


    Vir prudens non contra ventum mingit
  •  11-01-2007, 00:36 23353 σε απάντηση της 23338

    Απ: DataGridView Refresh

    Μάνο είσαι μέσα στο μυαλό μου :)

    Αυτό ακριβώς σκεπτόμουν και εγώ όσον αφορά το να φορτώνω όλα τα Data.

    Αυτό τι περισσότερες φορές δεν βολεύει.

    Οπότε κατέληξα στα εξής.

    1.Παραγελίες με select και ανάλογο Filter στο Fill του Table ......(Master)

    2.Στό BindingSource1_PositionChanged γέμισμα ανάλογο......με το ID του Master..(Detail)

    3.Δύο DatagridView,αριστερό για Master και δεξί για Detail

    Πως σου φαίνετε ;

    Απλά δεν βρήκα άλλο τρόπο απο το DataView στο DataSource του BindingSource1

    Υ.Γ

    Που θα μπορούσα να καταχωρήσω μία class γιά read,insert,update,delete κλπ την GmData και ένα Control το GmDgLookUp ένα γενικό ευρετήριο με πολλαπλές επιλογές

    κλπ γιά συζήτηση και γνώμες


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