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

 

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

DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 31-08-2012, 16:33. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-08-2012, 00:50 71126

    DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Καλησπέρα, 

    Έχω ένα DataGridView σε μια φόρμα που εμφανίζει αποτελέσματα ανάλογα με το ποιο κουμπί πατιέται. άλλες φορές μιλάμε για 5 σειρές, άλλες για 10, και άλλες 50 χιλιάδες σειρές.

    Προφανώς στις 10 σειρές το αποτέλεσμα είναι instant, όμως στις 50 χιλιάδες, το να ενημερώνω το datagridview για κάθε εγγραφή είναι πολύ χρονοβόρο!


    Σκέφτηκα λοιπόν να χρησιμοποιήσω το .DataSource property του DGV.. έλα όμως που αντί να μου βγάλει τα αποτελέσματα, μου λέει το πόσο Length έχουν...

    Τι ακυρωσίνη θεέμου!


    έχω δοκιμάσει List (of MyClass) όπου MyClass είναι μια κλάση με 5 μεταβλητές (για 5 columns που θέλω)

    έχω δοκιμάσει List (of String) για να δω τι θα γίνει σε 1-dimentional

    επίσης και String()

    αλλά και String(,) [βγάζει πρόβλημα εδώ. τα άλλα όλα τα δέχετε, απλώς αντί των αποτελεσμάτων μου λέει πόσο length έχει το κάθε string]

    δοκίμασα και List (of List( of String))


    τίποτα...

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

    Η ερώτησή μου σε όλο αυτό είναι, πως να το κάνω να καταλάβει ότι δεν θέλω να μου δείχνει το Length του string αλλά το string το ίδιο?!?!


    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
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim KatiMegalo As New List(Of List(Of Object)) 'String = {{"Ena", "Tria", "Dio", "Tessera"}, {"Pente", "Eksi", "Efta", "Okto"}}
            Dim Str(1) As List(Of Object)
    
            Dim Kati As New List(Of Object)
            Kati.Add("Ena")
            Kati.Add("Dio")
            Kati.Add("Tria")
            Kati.Add("Tessera")
            KatiMegalo.Add(Kati)
    
            Dim KatiAllo As New List(Of Object)
            KatiAllo.Add("Ena")
            KatiAllo.Add("Dio")
            KatiAllo.Add("Tria")
            KatiAllo.Add("Tessera")
            KatiMegalo.Add(KatiAllo)
    
            Str(0) = Kati
            Str(1) = KatiAllo
    
            Dim frmNewSheet As New frmZStatisticsSheet
            With frmNewSheet
    
                .DataGridView1.DataSource = Kati
                .Show()
            End With
        End Sub




  •  25-08-2012, 23:07 71137 σε απάντηση της 71126

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Το List(Of MyClass) θα έπρεπε να σου παίζει (όχι με το συγκεκριμένο όνομα γιατί είναι keyword της VB και θέλει square brackets). Επίσης μέσα στο Class δήλωσε τα πεδία που θέλεις ως properties και όχι σαν fields γιατί αλλιώς δεν θα σου τα δείχνει. Η όλη ιστορία γενικά δεν παίζει γιατί το DataSource property δείχνει τα properties του string που στην συγκεκριμένη περίπτωση είναι μόνο το Length. Μπορείς το ίδιο πράγμα να το κάνεις και με LINQ αν θέλεις.

    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
     
    Option Strict On
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim li As New List(Of AClass)
    
            For i = 1 To 10
                li.Add(New AClass With
                             {
                                .Field1 = i,
                                .Field2 = i.ToString() & "a",
                                .Field3 = i.ToString() & "b",
                                .Field4 = i.ToString() & "c",
                                .Field5 = i.ToString() & "d"
                            })
            Next
    
            DataGridView1.DataSource = li
        End Sub
    
        Private Class AClass
            Public Field1 As Integer ' Αν δεν είναι property δεν θα το δείξει στο Grid.
            Public Property Field2 As String
            Public Property Field3 As String
            Public Property Field4 As String
            Public Property Field5 As String
        End Class
    
    End Class

  •  25-08-2012, 23:32 71138 σε απάντηση της 71137

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Ευχαριστώ πλ!!!

    αύριο μεσημέρι προς απόγευμα που θα πάω στον υπολογιστή με το πρόγραμμα θα το δοκιμάσω.


    Παραλίγο να τρελαθώ μιλάμε.. δοκίμασα ότι μπορούσα να φανταστώ και ή δεν θα έδειχνε τίποτα, ή θα έδειχνε length

    Που να φανταστώ ότι πρέπει να τα βάλω property... :Ρ


  •  27-08-2012, 13:32 71141 σε απάντηση της 71138

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Πράγματι δούλεψε ^^

    Ευχαριστώ πολύ!


    Έχω σημειώσει το thread ως επιλυμένο, ωστόσο έχω μία ακόμη ερώτηση... αν δεν ξέρω πόσα columns θα χρειαστούν, μπορώ με κάποιο τρόπο να κάνω κάτι παρόμοιο?

    Δηλαδή αντί να πάω να γράφω κατευθείαν πάνω στο κάθε cell του DataGridView, με κάποιο τρόπο να γράφω σε μια μεταβλητή [ όπως αυτή τώρα που ήταν List(of MyClass) ] και να το περνάω σαν datasource.


    Δεν έχω λόγια να περιγράψω το πόσο ποιο γρήγορο είναι με datasource.. Ευτυχώς γι αυτό το χρονοβόρο πρόβλημα ήξερα ότι πάντα θα υπάρχουν 5 columns, οπότε έβαλα 5 string properties και έγινε 

    θα ήταν τέλειο αν γινόταν το ίδιο κάπως για άγνωστο αριθμό column..


  •  28-08-2012, 00:04 71142 σε απάντηση της 71141

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Εγώ στην θέση σου θα χρησιμοποιούσα DataTables και Datasets. Μπορείς σε ένα DataTable να προσθέτεις και να αφαιρείς δυναμικά Columns και μετά να τα δείχνεις ως Datasources στο grid ίσως μετά την ανάγνωση δεδομένων από κάποια βάση ή από ένα XML αρχείο. Επίσης αν βάλεις πολλά datatables σε ένα Dataset με datarelations και χρησιμοποίησεις το παλιό control (το DataGrid) σου δείχνει ακόμα και την Ιεραρχική δομή των DataTables. Στην Περίπτωση που θέλεις λίστες οι λύσεις που γνωρίζω είναι είτε με reflection (Να βάλεις properties δυναμικά σε μία καινούργια ή υπάρχουσα class) ή χρησιμοποιώντας κάποια Interfaces από το System.ComponentModel namespace τα οποία δυστυχώς δεν θυμάμαι ποιά είναι.

    Νομίζω ότι στην δική σου περίπτωση τα DataTables είναι πολύ καλή και απλή λύση ακόμα και αν δεν "τραβάς" τα δεδομένα από Database.
  •  28-08-2012, 00:43 71143 σε απάντηση της 71142

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Όχι όχι, δεν θέλω ντε και καλά λίστες. Μου αρέσει να μαθαίνω καινούργια πράγματα, και θέλω να το κάνω με τον ποιο efficient τρόπο.

    Τα dataset και datatables φαίνονται ενδιαφέροντα!


    Δεν καταλαβαίνω πως να το δουλέψω όμως..

    έχω αυτό:

    1
    2
    3
    4
    5
    6
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim TestVar1 As New DataSet
            Dim TestVar2 As New DataTable
    
    
        End Sub

    και είδα ότι και στο DataSet και στο DataBable έχει "ReadXml", και μια εντολή "Load" αλλά δεν θέλω να διαβάσω Xml, θέλω να του δίνω εγώ τιμές στα cells

    κάτι του τύπου

    1
    2
    3
    4
    5
    6
     
    Dataset.AddColumn(Onoma)
    
    Dataset.AddRows(2)
    
    Dataset.Columns(0).Rows(0).Item = "Kati"
    Dataset.Columns(0).Rows(1).Item = "Kati Allo"

    Καταλαβαίνω βέβαια ότι δεν θα είναι έτσι ακριβώς, αλλά σίγουρα θα υπάρχει κάποιος παρόμοιος τρόπος. Δηλαδή να περνάς τιμές έτσι.


  •  29-08-2012, 22:28 71153 σε απάντηση της 71143

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Ναι βεβαίως και γίνεται αν και συνήθως χρησιμοποιούνται πιό πολύ από Queries σε βάσεις Δεδομένων. Στο παρακάτω παράδειγμα και καλά κάποιος στην αποθήκη (o Logistician) πατάει ένα κουμπί, του εμφανίζει κάποιες παραγγελίες, "σημαδεύει" ποιές είναι γιά να φύγουν σήμερα και οι μάγκες με τα μηχανάκια (RF) και τα περονοφόρα τρέχουν να κάνουν Picking (Συλλογή). Συνδυάζει ένα datatable, ένα μικρό expression και αλλάζει το χρώμα του GridCell ανάλογα με την ημερομηνία.

    Τα Datasets είναι DATABASE LIKE DATA CONTAINERS. Κάνεις ένα Select από την βάση ή από κάποιο data source, γεμίζεις κάποια tables, τα βάζεις σε ένα Dataset με τις σχέσεις που έχουν και τα δείχνεις στον Χρήστη.
    Στο συγκεκριμένο παράδειγμα ένα table  γεμίζει και καλά από τον Order Master πίνακα. Λείπουν τα είδη και οι ποσότητες της παραγγελίας αλλά δεν πειράζει :). 

    Το πλεονέκτημα των Datatables είναι κυρίως ότι κρατάνε τις αλλαγές των τιμών που έχουν γίνει σε αυτά και τα row States που έχουν (added, deleted κλπ), αυτό και μόνο σου επιτρέπει να ελέγχεις και να  κάνεις διορθώσεις στα δεδομένα πρίν καταχωρηθούν ή εμφανιστούν. Την όλη διαδικασία στην περιγράφω γιά να πάρεις και μία μικρή γεύση από WMS τα οποία κάνουν την Oracle να σηκώνει τα χέρια ψηλά και τον SQL Server και τα πόδια μαζί. Γενικά σου συνιστώ να χρησιμοποιείς Datasets-Datatables όπου έχεις δεδομένα σε μορφή πίνακα. Δεν είναι τόσο γρήγορα όσο τα απλά lists αλλά οι δυνατότητες που προσφέρουν είναι πάρα πολλές και είναι κατά την γνώμη μου από τα πιό σημαντικά assemblies του .net framework.

    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
     
    Option Strict On
    Option Infer Off
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim dtOrder As New DataTable("Orders")
            Dim r As DataRow
            Dim DispatchDate As Date = Date.Now
    
            dtOrder.Columns.Add("ID", GetType(Integer))
            dtOrder.Columns.Add("Code", GetType(String))
            dtOrder.Columns.Add("Customer", GetType(String))
            dtOrder.Columns.Add("Dispatch Date", GetType(Date))
            dtOrder.Columns.Add("Dispatch Today") ' , GetType(String)
    
            dtOrder.Columns("Dispatch Today").Expression = "iif([Dispatch Date] > #" _
                & New Date(Now.Year, Now.Month, Now.Day, 23, 59, 59) & "#, 'Όχι', 'Ναι' )"
    
            For i As Integer = 1 To 2000
                r = dtOrder.NewRow()
    
                r.Item("ID") = i
                r.Item("Code") = "ORD_" & i.ToString()
                r.Item("Customer") = "Nikos"
                r.Item("Dispatch Date") = DispatchDate
    
                DispatchDate = DispatchDate.AddMinutes(1)
    
                dtOrder.Rows.Add(r)
            Next i
    
            dtOrder.AcceptChanges()
    
            With DataGridView1
                .DataSource = dtOrder
    
                .Columns("ID").Visible = False
                .Columns("Code").HeaderText = "Κωδικός"
                .Columns("Code").ReadOnly = True
                .Columns("Customer").HeaderText = "Πελάτης"
                .Columns("Dispatch Date").HeaderText = "Ημ/νία Αποστολής"
                .Columns("Dispatch Today").HeaderText = "Σημερινή Αποστολή;"
            End With
        End Sub
    
        Private Sub DataGridView1_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _
            Handles DataGridView1.CellFormatting
    
            If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Dispatch Today" Then
                If Not e.Value Is System.DBNull.Value AndAlso DirectCast(e.Value, String) = "Ναι" Then
                    e.CellStyle.ForeColor = Color.Red
                End If
            End If
        End Sub
    End Class


     
  •  29-08-2012, 23:17 71154 σε απάντηση της 71153

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Πάρα πολύ ωραίο! Είναι ακριβώς αυτό που ψάχνω, και εκτός του ότι είναι τέλειο, μου επιτρέπει να αλλάξω και χρώμα σε κελιά στο DataGridView.


    Δεν ήξερα ότι μπορούσα να το κάνω αυτό σε συγκεκριμένο κελί και ήθελα πολύ να κάνω το εξής:

    Όπως βγαίνει π.χ. αυτή η φόρμα


    Ήθελα να βάλω τα στοιχεία (Κατάστημα, Οδός, Τ.Κ. κτλ) όπως επίσης και ότι δεν είναι νούμερο να φαίνονται bold

    και το πρώτο να είναι και με μεγαλύτερη γραμματοσειρά.


    Είχα την εντύπωση ότι το DataGridView δεν επιτρέπει να αλλάζεις το πως φαίνονται τα γράμματα


  •  30-08-2012, 22:01 71165 σε απάντηση της 71154

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Ότι θέλεις μπορείς να κάνεις σε Datagridview και αλλαγές fonts, χρώματα κλπ, αλλά νομίζω ότι στην συγκεκριμένη περίπτωση κατά την γνώμη μου αυτό που θα έπρεπε να κάνεις θα ήταν να φτιάξεις εκτύπωση με Preview γιά το δελτίο που έδειξες. Γιατί να φτιάξεις εσύ report engine από την αρχή; θα χάσεις χρόνο και να ξέρεις ότι πολύ σπάνια 2 ή περισσότεροι χρήστες θα ικανοποηθούν με το layout που τους προτείνεις και αυτό είναι είναι και από τα μεγαλύτερα πλεονεκτήματα των εκτυπώσεων σε σύγκριση με το να φτιάχνεις φόρμες, να βάζεις if γιά κάθε Περίπτωση και να κάνεις build κάθε φορά.

    Κατά την γνώμη μου θα ήταν καλύτερο να δεις ποιές από τις φόρμες τις εφαρμογής σου θα πρέπει να γίνουν εκτυπώσεις και να τις φτιάξεις έτσι.

  •  31-08-2012, 09:58 71167 σε απάντηση της 71165

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2012]

    Εννοείς με το crystal report που μου είχες προτείνει σε [http://www.dotnetzone.gr/cs/forums/thread/70986.aspx] αυτό το πόστ?

    Νόμιζα ότι αυτό είναι μόνο για Print, δεν είχα συνειδητοποιήσει ότι μιλάμε για μια φόρμα ολόκληρη.


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

    Έφαγα κάποιες μέρες σε αυτό, και μετά έπρεπε να κάνω το πρόγραμμα ποιο γρήγορο (εξού και η προσπάθειά μου να περνάω τα πράγματα με datasource).

    και το τέλος το ξέρεις, κατέληξα σε αυτό το thread :)


    Είναι πολλές φόρμες του προγράμματος που πρέπει να γίνονται και εκτύπωση (ουσιαστικά όλες οι στατιστικές: Προϊόντων, Μαγαζιών...)


    Άρα σύμφωνα με αυτά που μου είπες σε αυτό και στο προαναφερθέν thread, θα πρέπει να κάνω τα εξής:

    1) Να αλλάξω επειγόντως τον τρόπο που περνιούνται τα δεδομένα σε όλες τις φόρμες στο -DataGridView- από "List(Of MyClass)" και "απλές μεταβλητές", σε "DataTable"

    2) Να δω το λίνκ που ανέφερες στο προαναφερθέν thread έτσι ώστε να έχει νόημα το να μου φτιάξεις το παράδειγμα που αναφέρεις.


    Τα παίρνω λοιπόν με τη σειρά, και θα αλλάξω τώρα τα πάντα σε DataTable.

    Μόλις δω και το λίνκ, θα κάνω πόστ στο [http://www.dotnetzone.gr/cs/forums/thread/70986.aspx] ότι είμαι έτοιμος για το παράδειγμα του Crystal Report. (βέβαια αν βρεις χρόνο μπορείς να το γράψεις από τώρα ώστε όποτε κι αν τελειώσω να είναι έτοιμο).


    Εννοείται ότι έχεις ήδη μπει στα Credits και αυτού του προγράμματος. Δεν υπάρχουν λόγια να περιγράψω πόσο με έχεις βοηθήσει.

    Ευχαριστώ.


  •  31-08-2012, 16:33 71173 σε απάντηση της 71167

    Απ: DataGridView DataSource: List(of String) δεν δουλεύει [VB.NET 2010]

    Τελείωσα με την αλλαγή σε DataTable

    Τελικά δεν ήταν τίποτα, μερικές ώρες μου πήρε μόνο :)

    Τώρα οι φόρμες βγαίνουν όλες με DataSource το DataTable






    κτλ...


    Τώρα ξεκινώ να δω το λίνκ που μου έδωσες http://msdn.microsoft.com/en-us/library/ms251784.aspx

    (αφού πιω λίγο νερό βέβαια :Ρ )


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