Aggiornamento Datagridview

di il
19 risposte

Aggiornamento Datagridview

Ciao a tutti
Mi trovo innanzi a un problema :
tramite una SELECT ad un database popolo un datagridview ma nel farlo il programma mi fa vedere lo scorrere delle righe man mano che si popolano.
e' possibile non vedere questo..??
o meglio visualizzare tutte le righe solo dopo l'avvenuto caricamento dei dati..??
Grazie a tutti anticipatamente..!!

19 Risposte

  • Re: Aggiornamento Datagridview

    Mostra il codice che stai usando
  • Re: Aggiornamento Datagridview

    Sub carica_dati()

    Me.Label1.Text = Home.ToolStripStatusLabel3.Text

    '________________________________________________________________CARICA DATI______________________________________
    Dim dir As String
    dir = Home.StatusStrip.Items(1).Text
    Me.DataGridView1.Rows.Clear()
    stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    stringa = stringa & dir & "\DB_ADESA.mdb"
    cn = New ADODB.Connection
    rs = New ADODB.Recordset
    cn.Open(stringa)
    Dim dacercare As String
    dacercare = Label1.Text
    Dim stato As String = "IN LAVORAZIONE"
    If RadioButton2.Checked = True Then rs.Open("SELECT * FROM GARE_T ", cn, 3, 3)
    If RadioButton1.Checked = True Then rs.Open("SELECT * FROM GARE_T WHERE IN_LAV_DA like '" & dacercare & "'", cn, 3, 3)
    If rs.EOF Then
    Else
    Dim i As Decimal : i = 0
    While rs.EOF = False
    '_____________________________________________________POPOLO LA DATAGRIDVIEW________________________________

    Me.DataGridView1.Rows.Add(rs("ID").Value, rs("RDO").Value, rs("LOTTI").Value, rs("ENTE").Value, rs("IMPORTO").Value, rs("STATO").Value, rs("DATA_SC").Value, gg, gg2, rs("CODICE").Value, rs("LINK_CART").Value, rs("IN_LAV_DA").Value, rs("GARANZIA").Value, rs("SOPRALLUOGO").Value)


    End While
    End If
    Label2.Text = "PRESENTI N. " & rs.RecordCount & " RECORDS"
    cn = Nothing
    rs = Nothing
    End Sub
  • Re: Aggiornamento Datagridview

    Salve,
    invece di popolare la griglia in questo modo cosi' manuale, probabilmente e' meglio usare il databinding del controllo, impostando ad esempio

    Me.DataGridView = rs

    salutoni
    --
    Andrea
  • Re: Aggiornamento Datagridview

    Forse ma il problema che dal databse non prelevo tutti i campi ma solo quelli che mi servono...
    non esiste un modo per non visualizzare il refresch e poi riattivarlo alla fine..??
    Grazie per la tua risposta....
  • Re: Aggiornamento Datagridview

    Invece di SELECT * seleziona i campi da importare
  • Re: Aggiornamento Datagridview

    Prom ha scritto:


    Forse ma il problema che dal databse non prelevo tutti i campi ma solo quelli che mi servono...
    Sei tu che li prendi tutti ma chi ti obbliga?
  • Re: Aggiornamento Datagridview

    Ciao Oregon, non avevo mai visto popolare una DGV tramite recordset, è un retaggio di VB6 ?
  • Re: Aggiornamento Datagridview

    Perché non l'hai mai visto? Si può fare come in VB6 (per le griglie del VB6) come si può fare in tutti e due gli ambienti in maniera automatica.
  • Re: Aggiornamento Datagridview

    Ho sempre usato il DataAdapter ed una DataTable, ci sono vantaggi ad usare recordset ?
  • Re: Aggiornamento Datagridview

    Salve,

    Prom ha scritto:


    Forse ma il problema che dal databse non prelevo tutti i campi ma solo quelli che mi servono...
    non esiste un modo per non visualizzare il refresch e poi riattivarlo alla fine..??
    Grazie per la tua risposta....
    oltre a quanto ha gia' detto @Oregon circa il fatto di specificare nella proiezione le colonne che effettivamente ti servono, puoi anche specificare a runtime specificando, prima di assegnare il recordset al datasource, che vorrai indicare "nominalmente" e non accettando l'autogenerazione, quindi aggiungerai le colonne a te interessanti come desiderato... considera ad esempio che a te serva qualche cosa come
    SELECT [Id], [Descrizione], [IdTabellaReferenziata], [Prezzo], [Quantita] FROM xxxx;
    mentre la tua datagridview dovra' mostrare "solo" la [Descrizione], il "riferimento" alla tabella referenziata, [Prezzo] e [Quantita], ed inoltre un'ulteriore colonna con un "dato ricalcolato" a runtime dato da [Prezzo] x [Quantita]...
    la colonna [Id] ti servira' poi ovviamente per effettuare gli aggiornamenti alla base dati, ma ripeto, "non la vuoi vedere"..

    come concetto, quindi trivialmente, definirai ad esempio un metodo per ottenere i tuoi dati che alimentano la datagridview, un metodo che alimenta il combobox presente nella griglia popolata dalla tabella referenziata... poi definirai quali colonne vuoi aggiungere alla griglia e implementi l'evento CellFormatting per popolare a runtime una colonna calcolata...
    qualche cosa simile a
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            DefineDGV()
    
        End Sub
    
    #Region "#--- DATA methods   ---#"
    
        Private Function GRD_GetMainData() As DataTable
    
            'ottieni un datatable / dataview o una POCO list per alimentare la datagridview
            'SELECT [Id], [Descrizione], [IdTabellaReferenziata], [Prezzo], [Quantita] FROM xxxx;
    
        End Function
    
        Private Function GRD_GetAvailableProducts2Reference() As DataTable
    
            'ottieni un datatable / dataview o una POCO list per popolare il combo
    
        End Function
    
    #End Region
    
    #Region "#--- Private methods   ---#"
    
        Private Sub DefineDGV()
    
            With DataGridView1
                .SuspendLayout()
                If .IsCurrentCellInEditMode Then .CancelEdit()
                .DataSource = Nothing
                .Columns.Clear()
                .AutoGenerateColumns = False ' definizione manuale delle colonne
    
                Dim tCol As New System.Windows.Forms.DataGridViewTextBoxColumn
                tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
                With tCol
                    .DataPropertyName = "Descrizione"
                    .Name = "Descrizione"
                    .HeaderText = "Descrizione"
                    .Resizable = System.Windows.Forms.DataGridViewTriState.True
                    .Width = 110
                    .MaxInputLength = 100
                    .MinimumWidth = 100
                    .SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic
                    .ReadOnly = False
                    .ToolTipText = "Descrizione del prodotto"
                    .DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
                End With
                .Columns.Add(tCol)
                tCol = Nothing
    
                'tabella referenziata dal "catalogo prodotti" per selezione tramite combobox
                Dim cboCol As New System.Windows.Forms.DataGridViewComboBoxColumn
                cboCol = New System.Windows.Forms.DataGridViewComboBoxColumn
                With cboCol
                    .DataPropertyName = "IdTabellaReferenziata"
                    .Name = "IdTabellaReferenziata"
                    .HeaderText = "Prodotto"
                    .DisplayMember = "Colonna_tabella_referenziata_da_VISUALIZZARE"
                    .ValueMember = "ID_tabella_referenziata_da_salvare_nella_riga"
                    'ottieni un datatable / dataview o una POCO list per popolare il combo
                    .DataSource = GRD_GetAvailableProducts2Reference()
                    .Resizable = System.Windows.Forms.DataGridViewTriState.True
                    .Width = 80
                    .MinimumWidth = 40
                    .SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
                    .ReadOnly = False
                    .AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.NotSet
                    .ToolTipText = "Scelta del prodotto selezionato"
                    .FlatStyle = System.Windows.Forms.FlatStyle.Flat
                    .DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
                End With
                .Columns.Add(cboCol)
                cboCol = Nothing
    
                tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
                With tCol
                    .DataPropertyName = "Prezzo"
                    .Name = "Prezzo"
                    .HeaderText = "Prezzo Unitario"
                    .Resizable = System.Windows.Forms.DataGridViewTriState.False
                    .Width = 70
                    .MaxInputLength = 10
                    .MinimumWidth = 40
                    .SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
                    .ReadOnly = False
                    .ToolTipText = "Prezzo Unitario del prodotto MANUALE e NON preso dalla tabella prodotti"
                    .DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
                    .DefaultCellStyle.Format = "#,#.00"
                End With
                .Columns.Add(tCol)
                tCol = Nothing
    
                tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
                With tCol
                    .DataPropertyName = "Quantita"
                    .Name = "Quantita"
                    .HeaderText = "Quantità"
                    .Resizable = System.Windows.Forms.DataGridViewTriState.False
                    .Width = 70
                    .MaxInputLength = 5
                    .MinimumWidth = 40
                    .SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
                    .ReadOnly = False
                    .ToolTipText = "Quantità di prodotto acquistata"
                    .DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
                    .DefaultCellStyle.Format = "#,0"
                End With
                .Columns.Add(tCol)
                tCol = Nothing
    
                'questa colonna viene ricalcolata a runtime
                tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
                With tCol
                    .Name = "RICALCOLO_MANUALE"
                    .HeaderText = "Pr.Totale Ricalcolato"
                    .Resizable = System.Windows.Forms.DataGridViewTriState.False
                    .Width = 70
                    .MaxInputLength = 0
                    .MinimumWidth = 40
                    .SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
                    .ReadOnly = True
                    .ToolTipText = "Prezzo Totale NETTO (IVA Scorporata)"
                    .DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
                    .DefaultCellStyle.BackColor = System.Drawing.SystemColors.InactiveCaption
                    .DefaultCellStyle.ForeColor = System.Drawing.SystemColors.InactiveCaptionText
                    .DefaultCellStyle.Format = "#,#.00"
                End With
                .Columns.Add(tCol)
                tCol = Nothing
    
    
                .AllowUserToOrderColumns = False    ' <- come ti serve
                .AllowUserToAddRows = True          ' <- come ti serve
                .AllowUserToDeleteRows = True       ' <- come ti serve
                .AllowUserToResizeRows = False      ' <- come ti serve
                .ResumeLayout()
    
                .DataSource = GRD_GetMainData()
            End With
    
        End Sub
    
    #End Region
    
    #Region "#--- Events    ---#"
    
        Private Sub DataGridView1_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    
            If Not CType(sender, System.Windows.Forms.DataGridView).DataSource Is Nothing AndAlso e.RowIndex >= 0 Then
                If Not Me.DataGridView1.Rows(e.RowIndex).DataBoundItem Is Nothing AndAlso e.ColumnIndex = Me.DataGridView1.Columns("RICALCOLO_MANUALE").Index Then
                    Dim dc As Decimal = CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRow)("Prezzo") * CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRow)("Quantita")
                    e.Value = dc
                    e.FormattingApplied = True
                End If
            End If
    
        End Sub
    
    #End Region
    
    End Class
    qualche cosa di simile, quindi...
    salutoni
    --
    Andrea
  • Re: Aggiornamento Datagridview

    Buonasera..!!
    Intanto grazie a tutti per l'interessamento al quesito....
    purtroppo essendo un appassionato (dilettante) di informatica è l'unico modo che so utilizzare per leggere dati da un DB e popolare una DGV.
    Sono sicuro che esistono modi più efficaci e funzionali (che non mancherò di imparare ).
    Provero' la soluzione di asql sperando di risolvere....
    Un caro saluto a tutti voi....
    Ancora Grazie infinite..!!
  • Re: Aggiornamento Datagridview

    Quindi ricapitolando con il metodo che ho usato io è normale che si veda lo scorrere delle righe della DGV..??
    non esiste un modo per non far visualizzare questo..??
    Qualcosa tipo come si fa in VBA application.screenupdating=false e poi a fine caricamento application.screenupdating=true....
    Grazie ancora..!!
  • Re: Aggiornamento Datagridview

    Salve

    Prom ha scritto:


    Quindi ricapitolando con il metodo che ho usato io è normale che si veda lo scorrere delle righe della DGV..??
    direi di si, in quanto il popolamento della griglia dipende da un bindingcontext che viene popolato riga per riga... l'operazione e' "pesante" e probabilmente le righe rischiano anche di non rimanere "shared" nel contesto.. vedi le FAQ del controllo scritto dal pm del controllo https://social.msdn.microsoft.com/Forums/windows/en-US/5378b9af-d0b6-4041-80ab-e76ac21c1cd4/need-help-check-out-the-datagridview-faq?forum=winformsdatacontrols che pero' non sembra piu' disponibile direttamente ma e' comunque disponibile presso http://dineshbajajktn.blogspot.com/2012/11/windows-formsdatagridview-faq-download.html
    non esiste un modo per non far visualizzare questo..??
    Qualcosa tipo come si fa in VBA application.screenupdating=false e poi a fine caricamento application.screenupdating=true....
    Grazie ancora..!!
    il modo veloce l'ho gia' indicato... basta avere un binding context valido, tecnicamente che implementi almeno IList... se vuoi c'e' un'implementazione di BindingListView che e' una classe interessante proprio per la possibilita' di associarla a UI control, http://blw.sourceforge.net ... non ricordo se solo in c#, nel caso ti do la "mia" traduzione in VB che feci tanti anni fa...
    salutoni
    --
    Andrea
  • Re: Aggiornamento Datagridview

    Prova e adatta questo codice
    Dim Rs As New ADODB.Recordset()
            Dim Cn As New ADODB.Connection()
            Dim stringa As String
            stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=percorsocompleto"
            Cn.Open(stringa)
            Rs.Open("Select Campo1, Campo2 from nometabella", Cn, 3, 3)
            Dim myDA As OleDbDataAdapter = New OleDbDataAdapter()
            Dim dt As DataTable = New DataTable
            myDA.Fill(dt, Rs)
            DataGridView1.DataSource = dt
            Rs = Nothing
            Cn.Close()
            Cn = Nothing
Devi accedere o registrarti per scrivere nel forum
19 risposte