+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26

Discussione: DatagridView Totali Riga

  1. #1
    Gidisoft non è in linea Scolaretto
    Post
    98

    DatagridView Totali Riga

    Ringraziando anticipatamente per l'aiuto pongo un quesito Datagridview
    Sto popolando una gridwiew per un riepilogo di documenti. Il risultato è qualcosa del genere come sotto. E come sotto, la scroll bar muove tutte le righe compreso il totale, che si perde in basso.
    Considerando che la proprietà frozen ha l'effetto opposto a quello che mi serve, esiste una proprietà per "ancorare l'ultima riga"?

    Doc Cli -Forn ART1 ART2
    1 Fornitore1 100 100
    2 Cliente1 50 10
    3 Cliente2 2 5
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    . Cliente3 v1 v2
    Totali 48 85

  2. #2
    L'avatar di sistemista
    sistemista non è in linea Topo di biblioteca
    Luogo
    Prato
    Post
    2,774
    No.
    Per far sì che venga visualizzato il totale dovresti agire via codice senza l'ausilio del datagridview.
    Poi, bisogna vedere come hai strutturato il datagridview,magari posta del codice.
    Sono stato nella terra del terrore e dei Vampiri...la transilvania? No!..in Banca.
    A Lupara?Min***a...Tecnologia Sicula è!

  3. #3
    L'avatar di Sambu
    Sambu non è in linea Scolaretto
    Post
    81
    Potresti anche creare due DGV separati. Così risolveresti tutti i problemi. Però resto anche io in attesa di una risposta completa che utilizza un solo DGV.

  4. #4
    Gidisoft non è in linea Scolaretto
    Post
    98
    Il datagridview non ha ancora nessuna finezza. Il lavoro è fatto tutto a livello di sql . costruisco una pivot con gli articoli in colonna e poi, con un insert, inserisco nella mia temp una riga di totale, constrassegnandola con un valore al campo tipo riga. Poi carico in datatable e associo al datagrid.
    Il problema è solo visuale. Il totale non è ancorato in stile foot.
    Ora sto provando a gestire una seconda gridview , in cui ho solo la riga , ma non trovo un modo per tenerla allineata a quella sopra.
    La prima idea sarebbe di darle lo stesso datasource e poi , se possible, applicare un filtro per vedere solo la riga dove tiporiga=2...se ci riesco..

  5. #5
    Gidisoft non è in linea Scolaretto
    Post
    98
    Quote Originariamente inviato da Sambu Visualizza il messaggio
    Potresti anche creare due DGV separati. Così risolveresti tutti i problemi. Però resto anche io in attesa di una risposta completa che utilizza un solo DGV.
    Hai trovato un modo per :
    garantire che i totali della gridtot stiano sempre allineati ai relativi campi della griddett, anche quando eventualmente sposti le colonne a destra...e a manca?

  6. #6
    L'avatar di Sambu
    Sambu non è in linea Scolaretto
    Post
    81
    Quote Originariamente inviato da Gidisoft Visualizza il messaggio
    Hai trovato un modo per :
    garantire che i totali della gridtot stiano sempre allineati ai relativi campi della griddett, anche quando eventualmente sposti le colonne a destra...e a manca?
    Si avevo risolto usando delle label, con un DGV penso sia più semplice.
    Usavo l'evento del DGV :
    codice:
    .ColumnWidthChanged
    codice:
    Private Sub DGV1_ColumnWidthChanged(sender As Object, e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles DGV1.ColumnWidthChanged
            Dim columnW As Integer = 0
            Dim spacer As Integer = 0
    
            If e.Column.Name = "Quantita" Then
                columnW = DGV1.Columns("Quantita").Width
                spacer = DGV1.Columns("Descrizione").Width + DGV1.Columns("Sconto").Width
                DGV2.Columns("Spacer").Width = spacer
                DGV2.Columns("Totale_quantita").Width = columnW
    
            ElseIf e.Column.Name = "Importo" Then
                columnW = DGV1.Columns("Importo").Width
                DGV2.Columns("Totale_importo").Width = columnW
            Else
                spacer = DGV1.Columns("Descrizione").Width + DGV1.Columns("Sconto").Width
                DGV2.Columns("Spacer").Width = spacer
            End If
    End Sub
    Nel secondo DGV ho creato una colonna, denominata "Spacer" che uso per dare la posizione X della colonna che voglio allineare, in questo caso la colonna "Quantita".
    Il codice è semplicissimo, anche perchè non sono tanto esperto. Ma può essere un punto di partenza.
    Funziona perfettamente. Dovresti gestirti solo il Load del Form per allineare la larghezza della colonna "Spacer". Poi il gioco è fatto
    Naturalmente se non ti piace la soluzione della colonna "Spacer" nel DGV2 puoi anche spostare la posizione X di tutto il DGV2 così che sia allineato..
    Ultima modifica di Sambu; 02-07-2011 10:03  Motivo: Inserimento codice della possibile soluzione

  7. #7
    Gidisoft non è in linea Scolaretto
    Post
    98
    Il risultato è ottenuto. Ma se debuggi l'evento vedi che questo evento è processato "decinaia" di volte!
    Sono stato costretto a mettere un columns.count > x . Pare che l'evento scatti per ogni volta che il costruttore della grid aggiunge una colonna!
    Mi sono limitato ad usare gli indici delle colonne, perchè in questo riepilogo "ExcelLike" non sapro' per certo i nomi delle colonne.
    Sarebbe bello poter intercettare quando la grid è stata disegnata completamente anzichè skippare in questo modo barbaro.
    codice:
            If DGVDoc.Columns.Count > 7 Then
                DGVDocTot.Columns(0).Width = DGVDoc.Columns(1).Width + DGVDoc.Columns(2).Width + DGVDoc.Columns(3).Width + DGVDoc.Columns(4).Width + DGVDoc.Columns(5).Width
                DGVDocTot.Columns(1).Width = DGVDoc.Columns(6).Width
                DGVDocTot.Columns(2).Width = DGVDoc.Columns(7).Width
            End If
    Infine vorrei poter gestire una scrollbarr inferiore che muova entrambe le grid insieme.
    Ma quanta fatica per non aver messo un Datagridview.footer come rowindex ...
    Ultima modifica di elisab; 02-07-2011 19:01  Motivo: mancato utilizzo dei tag [code][/code]

  8. #8
    Luogo
    BS / MI
    Post
    1,608
    Blogs
    33
    Quote Originariamente inviato da Gidisoft Visualizza il messaggio
    Ma se debuggi l'evento vedi che questo evento è processato "decinaia" di volte!
    Sono stato costretto a mettere un columns.count > x . Pare che l'evento scatti per ogni volta che il costruttore della grid aggiunge una colonna!
    Mi sono limitato ad usare gli indici delle colonne, perchè in questo riepilogo "ExcelLike" non sapro' per certo i nomi delle colonne.
    Sarebbe bello poter intercettare quando la grid è stata disegnata completamente anzichè skippare in questo modo barbaro.
    If DGVDoc.Columns.Count > 7 Then
    DGVDocTot.Columns(0).Width = DGVDoc.Columns(1).Width + DGVDoc.Columns(2).Width + DGVDoc.Columns(3).Width + DGVDoc.Columns(4).Width + DGVDoc.Columns(5).Width
    DGVDocTot.Columns(1).Width = DGVDoc.Columns(6).Width
    DGVDocTot.Columns(2).Width = DGVDoc.Columns(7).Width
    End If
    Perchè decine e decine di volte ?
    Viene scatenato al Load() una volta sola per ogni Column ( e neanche per tutte... ) come è giusto che sia, inoltre l'impatto sulle prestazioni di questo fatto è di per sè del tutto trascurabile.
    Comunque non sono molto d'accordo con il tuo codice.
    A che serve fare :
    codice:
    DGVDocTot.Columns(0).Width = DGVDoc.Columns(1).Width + DGVDoc.Columns(2).Width +       
                                                   DGVDoc.Columns(3).Width + DGVDoc.Columns(4).Width +  
                                                   DGVDoc.Columns(5).Width
    ?
    Si può predisporre un secondo DGV per i totali, che si comporta come il DGV principale.

    Quote Originariamente inviato da Gidisoft Visualizza il messaggio
    Infine vorrei poter gestire una scrollbarr inferiore che muova entrambe le grid insieme.
    Fatto.

    Quote Originariamente inviato da Gidisoft Visualizza il messaggio
    Ma quanta fatica per non aver messo un Datagridview.footer come rowindex ...
    In effetti il Freeze sull'ultima riga ( o colonna ), o Footer che sia, è una delle varie voci nella "wish list" per VS già dal FW2.0.

    Io mi limito a fare un esempio, forse più generico :

    1. Ho un DGV principale con 6 Colonne [ indici da 0 a 5 ].
    Le prime 2 sono "descrittive", mentre le altre [ indici da 2 a 5 ] prevedono una somma.
    Gli indici delle colonne per cui è previsto un calcolo di somma sono tutti in una List(), definita a livello di Form :

    codice:
    Private totColIndices As New List(Of Integer)
    2. Aggiungo su Form un secondo DGV "DGV_totpercolonna".
    Basta che il nome sia quello. Tutto il resto lo faccio da codice.

    --> Perciò nel Form_Load() :

    codice:
            DGV.ScrollBars = ScrollBars.Both
            DGV.RowHeadersVisible = True
            For i As Integer = 1 To 100
                DGV.Rows.Add({i, "Campo_" & i, 5 * i, 10 * i, 15 * i, 20 * i})
            Next
    
            InitializeDGV_totpercolonna(DGV)
            ResizeDGV_totpercolonna(DGV)
    3.
    codice:
        Private Sub InitializeDGV_totpercolonna(ByRef mainDGV As DataGridView)
    
            totColIndices.AddRange({2, 3, 4, 5})
            With DGV_totpercolonna
                .Left = mainDGV.Left
                .Top = mainDGV.Bottom
                .Font = mainDGV.Font
                .ReadOnly = True
                .AllowUserToOrderColumns = False
                .AllowUserToResizeColumns = False
                .AllowUserToResizeRows = False
                .ScrollBars = ScrollBars.None
                .ColumnHeadersVisible = True
                .RowHeadersVisible = mainDGV.RowHeadersVisible
                .Columns.Clear()
                .Rows.Clear()
                For i As Integer = 0 To mainDGV.Columns.Count - 1
                    .Columns.Add(New DataGridViewColumn(mainDGV.Columns(i).CellTemplate))
                    .Columns(i).Width = mainDGV.Columns(i).Width
                    If totColIndices.Contains(i) Then .Columns(i).HeaderText = "Totale"
                Next
                Dim dgvr As New DataGridViewRow
                dgvr.CreateCells(mainDGV)
                .Rows.Add(dgvr)
                Dim tot As Double
                For i As Integer = 0 To totColIndices.Count - 1
                    tot = 0
                    For j As Integer = 0 To mainDGV.Rows.Count - 1
                        tot += Convert.ToDouble(mainDGV.Rows(j).Cells(totColIndices(i)).Value)
                    Next
                    .Rows(0).Cells(totColIndices(i)).Value = tot
                Next
            End With
    
        End Sub
    4.
    codice:
       Private Sub ResizeDGV_totpercolonna(ByRef mainDGV As DataGridView)
    
            If DGV_totpercolonna.Columns.Count = 0 Then Exit Sub
            With DGV_totpercolonna
                For i As Integer = 0 To mainDGV.Columns.Count - 1
                    .Columns(i).Width = mainDGV.Columns(i).Width
                Next
                If mainDGV.Controls.OfType(Of VScrollBar).SingleOrDefault.Visible = True Then
                    .Width = mainDGV.Width - SystemInformation.VerticalScrollBarWidth
                Else
                    .Width = mainDGV.Width
                End If
                If .ColumnHeadersVisible = True Then
                    .Height = .ColumnHeadersHeight + .RowTemplate.Height
                Else
                    .Height = .RowTemplate.Height
                End If
            End With
    
        End Sub
    La prolissità è solo apparente e dovuta al fatto che molte proprietà sono definite nel codice e alcune di esse dipendono da proprietà del DGV, e devono poter variare a runtime...

    Perciò se voglio sfruttare anche un Evento di modifica manuale, come il CellValueChanged() :

    codice:
       Private Sub DGV_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellValueChanged
    
            If totColIndices.Contains(e.ColumnIndex) Then
                Dim tot As Double
                For i As Integer = 0 To DGV.Rows.Count - 1
                    tot += Convert.ToDouble(DGV.Rows(i).Cells(e.ColumnIndex).Value)
                Next i
                DGV_totpercolonna.Rows(0).Cells(e.ColumnIndex).Value = tot
            End If
    
        End Sub
    Se voglio che i due DGV scrollino assieme :

    codice:
       Private Sub DGV_Scroll(sender As Object, e As System.Windows.Forms.ScrollEventArgs) Handles DGV.Scroll
    
            If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then
                DGV_totpercolonna.HorizontalScrollingOffset = DGV.HorizontalScrollingOffset
            End If
    
        End Sub
    E infine, se voglio sincronizzare le dimensioni delle colonne, assieme al fatto che questo può comportare la comparsa o meno della VScrollBar su DGV :

    codice:
        Private Sub DGV_ColumnWidthChanged(sender As Object, e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles DGV.ColumnWidthChanged
    
            ResizeDGV_totpercolonna(DGV)
        
        End Sub
    A questo punto direi che per la costruzione di un proprio UserControl che incorpori opportunamente i due DGV, il passo è breve...

    Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ]
    Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ]

  9. #9
    Gidisoft non è in linea Scolaretto
    Post
    98
    Sto agendo sulla Private Sub InitializeDGV_totpercolonna(ByRef mainDGV As DataGridView)

    generizzando in

    codice:
    Private Sub InitializeDGV_totpercolonna(ByRef mainDGV As DataGridView,ByRef totDGV As DataGridView)
    ma a parte questo ho comunque errori sintattici e di concetto nei 2 add

    Questo in particolare, anche se tolgo le graffe...
    totColIndices.AddRange({2, 3, 4, 5})
    Cosa sbaglio?
    Ultima modifica di elisab; 02-07-2011 19:01  Motivo: mancato utilizzo dei tag [code][/code]

  10. #10
    Gidisoft non è in linea Scolaretto
    Post
    98
    Cè qualcosa che mi sfugge. I Dati sono già presenti nella mia Datatable passata al gridview
    Perche' mi ci fai inserire delle righe??

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi