+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: ordinamento colonne DataGridView1

  1. #1
    Unistar non è in linea Novello
    Luogo
    Aosta
    Post
    14

    ordinamento colonne DataGridView1

    Problemino...

    ho creato un piccola applicazione che legg un file CSV con parecchi dati.

    Inserisco tutti i dati in una DataGridView e tramite il comando DisplayIndex riordino le colonne a mio piacere.

    Quando vado a salvare di nuovo il CSV tramite una funzione di indirizzamento es "cellvalue = DataGridView1.Item(I, j).Value" l'ordinamento reale non è quello visualizzato.

    Esiste una funzione che modifica propio l 'indice della colonna e non solo la visualizzazione?
    Altrimenti dovrei inserire una colonna copiare tutti i dati e poi cancellare la colonna originale....mi sembra macchiavellico

    GRazie

  2. #2
    Luogo
    Padova
    Post
    4,379
    Blogs
    36
    l'ordinamento "naturale" del datagridview è quello dato dal progressivo di inserimento e creazione nella base dati (dataset) di provenienza.
    Quando "riscrivi" un file csv ti devi preoccupare anche dell'ordine di estrazione quindi io personalmente farei una query di estrazione dei dati con ordinamento dedicata alla creazione del file csv in uscita.
    ----------------------------------------------------------
    Se avete delle domande fatele prima al forum
    Il mio blog su Masterdrive.it
    Il mio blog su Visual-Basic.it

  3. #3
    Unistar non è in linea Novello
    Luogo
    Aosta
    Post
    14
    ciao grazie per l interessamento.
    immaginavo che la proprieta index delle colonne non fosse modificabile purtroppo.

    Creare delle query sarei anche in grado ma mi farebbe scrivere un sacco di codice e non sono cosi bravo.

    Provo a darti piu dettagli.

    Il file csv arriva da una flight controller di un drone e comprende migliaia di dati in quanto campiona ogni secondo. Per poterlo far leggere ad altri programmi
    devo riordinare le colonne e nominarle in modo diverso oltre che a convertire metri in piedi ecc...
    Ho fatto tutto ed è tutto in una DataGridView cosi da poter controllare a video l esattezza delle conversioni.

    A questo punto devo riscrivere il file csv nell ordine giusto. (routine gia funzionante ma usa l iidex delle colonne)


    La notte mi ha portato a questa soluzione...(forse)

    penso che la soluzione piu semplice sia copiare le colonne in ordine da una DataGridView ad un altra...putroppo non riesco a capire come fare in quanto molti esempi parlano di copia incolla...

  4. #4
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    101
    Far ciclare il DisplyIndex invece dell'Index, nella routine di scrittura, funzionerebbe?

  5. #5
    patel45 non è in linea Scolaretto
    Post
    228
    buona idea, prova così
    codice:
       ' salva contenuto visibile -------------
        Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
            Dim sExportFileName As String = "F:\Download\csvsalvato.txt"
            Dim columnsInOrder As New List(Of DataGridViewColumn)
            For Each col As DataGridViewColumn In DGV1.Columns
                columnsInOrder.Add(col)
            Next
            columnsInOrder = columnsInOrder.OrderBy(Function(c) c.DisplayIndex).ToList()
            Dim sCSVExportLines As New List(Of String)
            Dim sHeaderText As String = ""
            For Each col As DataGridViewColumn In columnsInOrder
                If col.Visible = True Then
                    Dim sValue As String = ""
                    sValue = col.HeaderText.ToString
                    If sValue.Contains(",") Then
                        sValue = """" + sValue + """"
                    End If
                    sHeaderText = sHeaderText + sValue + ","
                End If
            Next
            sHeaderText = sHeaderText.Substring(0, sHeaderText.Length - 1)
            If Not String.IsNullOrEmpty(sHeaderText) Then
                sCSVExportLines.Add(sHeaderText)
            End If
            ' get row values
            For Each row As DataGridViewRow In DGV1.Rows
                Dim sRowValue As String = ""
                For Each col As DataGridViewColumn In columnsInOrder
                    If col.Visible = True Then
                        Dim sValue As String = ""
                        sValue = row.Cells(col.Index).Value
                        If Not String.IsNullOrEmpty(sValue) Then
                            If sValue.ToString.Contains(",") Then
                                sValue = """" + sValue + """"
                            End If
                        Else
                            sValue = ""
                        End If
                        sRowValue = sRowValue + sValue + ","
                    End If
                Next
                sRowValue = sRowValue.Substring(0, sRowValue.Length - 1)
                If Not String.IsNullOrEmpty(sRowValue) Then
                    sCSVExportLines.Add(sRowValue)
                End If
            Next
            ' write data to csv file
            Using sw As New IO.StreamWriter(sExportFileName, False, System.Text.Encoding.UTF8)
                For Each s As String In sCSVExportLines
                    sw.WriteLine(s.ToString)
                Next
            End Using
            If MessageBox.Show("CSV file created, open CSV file?", "Export Complete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = vbYes Then
                Process.Start(sExportFileName)
            End If
        End Sub

  6. #6
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    101
    Quote Originariamente inviato da patel45 Visualizza il messaggio
    buona idea, prova così
    codice:
       ' salva contenuto visibile -------------
        Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
            Dim sExportFileName As String = "F:\Download\csvsalvato.txt"
            Dim columnsInOrder As New List(Of DataGridViewColumn)
            For Each col As DataGridViewColumn In DGV1.Columns
                columnsInOrder.Add(col)
            Next
            columnsInOrder = columnsInOrder.OrderBy(Function(c) c.DisplayIndex).ToList()
            Dim sCSVExportLines As New List(Of String)
            Dim sHeaderText As String = ""
            For Each col As DataGridViewColumn In columnsInOrder
                If col.Visible = True Then
                    Dim sValue As String = ""
                    sValue = col.HeaderText.ToString
                    If sValue.Contains(",") Then
                        sValue = """" + sValue + """"
                    End If
                    sHeaderText = sHeaderText + sValue + ","
                End If
            Next
            sHeaderText = sHeaderText.Substring(0, sHeaderText.Length - 1)
            If Not String.IsNullOrEmpty(sHeaderText) Then
                sCSVExportLines.Add(sHeaderText)
            End If
            ' get row values
            For Each row As DataGridViewRow In DGV1.Rows
                Dim sRowValue As String = ""
                For Each col As DataGridViewColumn In columnsInOrder
                    If col.Visible = True Then
                        Dim sValue As String = ""
                        sValue = row.Cells(col.Index).Value
                        If Not String.IsNullOrEmpty(sValue) Then
                            If sValue.ToString.Contains(",") Then
                                sValue = """" + sValue + """"
                            End If
                        Else
                            sValue = ""
                        End If
                        sRowValue = sRowValue + sValue + ","
                    End If
                Next
                sRowValue = sRowValue.Substring(0, sRowValue.Length - 1)
                If Not String.IsNullOrEmpty(sRowValue) Then
                    sCSVExportLines.Add(sRowValue)
                End If
            Next
            ' write data to csv file
            Using sw As New IO.StreamWriter(sExportFileName, False, System.Text.Encoding.UTF8)
                For Each s As String In sCSVExportLines
                    sw.WriteLine(s.ToString)
                Next
            End Using
            If MessageBox.Show("CSV file created, open CSV file?", "Export Complete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = vbYes Then
                Process.Start(sExportFileName)
            End If
        End Sub
    Sublime! Io stavo giusto cercando di capire come ordinare gli indici. Mannaggia alle Lambda...

  7. #7
    Unistar non è in linea Novello
    Luogo
    Aosta
    Post
    14
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Far ciclare il DisplyIndex invece dell'Index, nella routine di scrittura, funzionerebbe?

    Ma porcapupazza questa è la soluzione piu facile!!!!!

    sono giorni che sbatto la testa per cercare di clonare colonne, copiare dati , mi stavo gia rassegnando alle query e invece bastava cambiare punto di vista.

    GRAZIE!

  8. #8
    Unistar non è in linea Novello
    Luogo
    Aosta
    Post
    14
    Quote Originariamente inviato da patel45 Visualizza il messaggio
    buona idea, prova così
    codice:
       ' salva contenuto visibile -------------
        Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
            Dim sExportFileName As String = "F:\Download\csvsalvato.txt"
            Dim columnsInOrder As New List(Of DataGridViewColumn)
            For Each col As DataGridViewColumn In DGV1.Columns
                columnsInOrder.Add(col)
            Next
            columnsInOrder = columnsInOrder.OrderBy(Function(c) c.DisplayIndex).ToList()
            Dim sCSVExportLines As New List(Of String)
            Dim sHeaderText As String = ""
            For Each col As DataGridViewColumn In columnsInOrder
                If col.Visible = True Then
                    Dim sValue As String = ""
                    sValue = col.HeaderText.ToString
                    If sValue.Contains(",") Then
                        sValue = """" + sValue + """"
                    End If
                    sHeaderText = sHeaderText + sValue + ","
                End If
            Next
            sHeaderText = sHeaderText.Substring(0, sHeaderText.Length - 1)
            If Not String.IsNullOrEmpty(sHeaderText) Then
                sCSVExportLines.Add(sHeaderText)
            End If
            ' get row values
            For Each row As DataGridViewRow In DGV1.Rows
                Dim sRowValue As String = ""
                For Each col As DataGridViewColumn In columnsInOrder
                    If col.Visible = True Then
                        Dim sValue As String = ""
                        sValue = row.Cells(col.Index).Value
                        If Not String.IsNullOrEmpty(sValue) Then
                            If sValue.ToString.Contains(",") Then
                                sValue = """" + sValue + """"
                            End If
                        Else
                            sValue = ""
                        End If
                        sRowValue = sRowValue + sValue + ","
                    End If
                Next
                sRowValue = sRowValue.Substring(0, sRowValue.Length - 1)
                If Not String.IsNullOrEmpty(sRowValue) Then
                    sCSVExportLines.Add(sRowValue)
                End If
            Next
            ' write data to csv file
            Using sw As New IO.StreamWriter(sExportFileName, False, System.Text.Encoding.UTF8)
                For Each s As String In sCSVExportLines
                    sw.WriteLine(s.ToString)
                Next
            End Using
            If MessageBox.Show("CSV file created, open CSV file?", "Export Complete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = vbYes Then
                Process.Start(sExportFileName)
            End If
        End Sub


    Grazie mille anche a te!!!
    sono sempre convito leggere il codice di altri serva piu che mille guide....

+ Rispondi al Thread

Permessi di invio

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