[VB.NET] Datagridview opslaan naar CSV, HTML, ...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 430xlkod
  • Registratie: Januari 2007
  • Laatst online: 05-07 23:11
Hello guys,

Ik probeer dus een .db3 bestand uit te lezen en deze te laten zien in een datagridview (werkt).
Maar ik wil hem opslaan als een CSV file. Ik heb daarvoor onderstaande code 'gevonden':
Visual Basic:
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
    Public Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Dim type As String = cboxType.SelectedItem()
        If type Is Nothing Then
            MessageBox.Show("Gelieve een opslag formaat te kiezen.", "Error", MessageBoxButtons.OK)
        Else
            If type.Contains("CSV") Then
                exportDGVToCSV(dir & "\exported_csv_db3.csv", Me.dgvMain, xboxHeaders.CheckState, txtTeken.Text)
            End If
        End If
    End Sub

    Public Sub exportDGVToCSV(ByVal strExportFileName As String, ByVal DataGridView As DataGridView, Optional ByVal blnWriteColumnHeaderNames As Boolean = False, Optional ByVal strDelimiterType As String = ",")
        Try
            Dim sr As StreamWriter = File.CreateText(strExportFileName)
            Dim strDelimiter As String = strDelimiterType
            Dim intColumnCount As Integer = DataGridView.Columns.Count - 1
            Dim strRowData As String = ""
            If blnWriteColumnHeaderNames Then
                For intX As Integer = 0 To intColumnCount
                    strRowData += Replace(DataGridView.Columns(intX).Name, strDelimiter, "") & IIf(intX < intColumnCount, strDelimiter, "")
                Next intX
                sr.WriteLine(strRowData)
            End If
            For intX As Integer = 0 To DataGridView.Rows.Count - 1
                strRowData = ""
                For intRowData As Integer = 0 To intColumnCount
                    strRowData += Replace(DataGridView.Rows(intX).Cells(intRowData).Value.ToString, strDelimiter, "") & IIf(intRowData < intColumnCount, strDelimiter, "")
                Next intRowData
                sr.WriteLine(strRowData)
            Next intX
            sr.Close()
        Catch ex As Exception
            '...
            MsgBox("Klaar met schrijven!")
        End Try
    End Sub


Maar hij geeft een NullPointerException bij regel 27 (op het einde) zodra hij op het einde van de grid is. Maar ondertussen is mijn CSV file toch goed geschreven en bestaat (en kan geopend worden). Daarom even de foute Try-Catch. Maar wat kan het zijn?
Tevens dan de vraag, kan ik dit ook uitschrijven naar een HTML bestand? Zodanig dus dat hij HTML tags print en daarin de waardes van de grid zet?

Bedankt alvast! Ik zoek ondertussen ook verder...

EDIT:
Heb even de hele code gedaan die relevant is.

EDIT2:
Kan het al opgelost worden met een HTML als ik gewoon kies voor laat zeggen:
Visual Basic:
1
exportDGVToHTML(dir & "\exported_csv_db3.html", Me.dgvMain, xboxHeaders.CheckState, "<td>")

Enzovoort...

EDIT3:
HTML support is ondertussen ook zogoed als klaar. Als interesse erin is dan post ik het wel even :) .

[ Voor 23% gewijzigd door 430xlkod op 07-05-2011 20:36 ]


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Heeft DataGridView niet by default een lege rij op het einde, zodat nieuwe rijen kunnen worden toegevoegd door de gebruiker? Die columns van die rij zijn standaard null, en daarvan probeer jij dus de Value te nemen op lijn 27. Dat geeft dan een NullPointerException.

Mocht je wat basic debugging gedaan hebben (een breakpoint zetten op lijn 27 en kijken waar precies de NullPointerException vandaan komt en wat de gegevens in je code en de DataGridView op dat moment zijn) zou je daar normaal moeten zijn achtergekomen, lijkt me (tenzij je dat al gedaan hebt en dat daaruit bleek dat dat het probleem niet is, maar dat blijkt niet uit de startpost).

[ Voor 4% gewijzigd door dingstje op 07-05-2011 23:23 ]

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • keesdewit
  • Registratie: December 2003
  • Laatst online: 19-06 20:46
Een gridview heeft meerdere RowTypes. Je zou moeten kijken of het een DataRow is:

Visual Basic:
1
2
3
If DataGridView.Rows(intX).RowType = DataControlRowType.DataRow Then
'Hier door cellen heen loopen
End If


Zie : http://msdn.microsoft.com....gridviewrow.rowtype.aspx

[ Voor 35% gewijzigd door keesdewit op 08-05-2011 00:27 ]


Acties:
  • 0 Henk 'm!

  • 430xlkod
  • Registratie: Januari 2007
  • Laatst online: 05-07 23:11
dingstje schreef op zaterdag 07 mei 2011 @ 23:23:
Heeft DataGridView niet by default een lege rij op het einde, zodat nieuwe rijen kunnen worden toegevoegd door de gebruiker? Die columns van die rij zijn standaard null, en daarvan probeer jij dus de Value te nemen op lijn 27. Dat geeft dan een NullPointerException.
Klopt, daar ben ik na de zoveelste keer debuggen uitgekomen (want debuggen doe ik normaal altijd voor ik hier iets post tenzij ik er echt niet uit kom). Maar opeens viel het me ook te binnen.
Ik heb dus ook gewoon volgende gedaan:
Visual Basic:
1
2
3
4
5
6
7
For intX As Integer = 0 To DataGridView.Rows.Count - 2
                strRowData = ""
                For intRowData As Integer = 0 To intColumnCount
                    strRowData += Replace(DataGridView.Rows(intX).Cells(intRowData).Value.ToString, strDelimiter, "") & IIf(intRowData < intColumnCount, strDelimiter, "")
                Next intRowData
                sr.WriteLine(strRowData)
            Next intX


En de code voor het printen van de HTML:
Visual Basic:
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
Public Sub exportDGVToHTML(ByVal strExportFileName As String, ByVal DataGridView As DataGridView)
        Try
            Dim sr As StreamWriter = File.CreateText(strExportFileName)
            Dim aantalKol As Integer = DataGridView.Columns.Count - 1
            Dim aantalRij As Integer = DataGridView.Rows.Count - 2
            sr.WriteLine("<table border=" & txtBorder.Text & ">")
            sr.WriteLine("  <tr>")
            For Each column As DataGridViewColumn In DataGridView.Columns
                sr.WriteLine("    <th>" + column.HeaderText + "</th>")
            Next
            sr.WriteLine("  </tr>")
            For i = 0 To aantalRij Step 1
                sr.WriteLine("  <tr>")
                For j = 0 To aantalKol Step 1
                    sr.WriteLine("    <td>" + DataGridView.Item(j, i).Value.ToString + "</td>")
                Next
                sr.WriteLine("  </tr>")
            Next
            sr.WriteLine("</table>")
            sr.Close()
            MsgBox("Klaar met schrijven!" & vbCrLf & "Bestand is opgeslagen in: " & dir)
        Catch ex As Exception
            MsgBox("ERROR!" & vbCrLf & ex.ToString())
        End Try
    End Sub


Kortom, zoiezo moet je normaal al -1 doen, maar doordat een DataGridView nog een lege rij toevoegd moet je -2 doen. Programma werkt dus nu ook zoals het moet in beide bestand formaten (CSV en HTML).

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Echt netjes is het ook nog niet, in de zin van niet futureproof. Wellicht werkt het nu wel, maar wat als je in de toekomst kolommen die null zijn effectief wil gaan ondersteunen? Dan krijg je alsnog een NullPointerException.Je zou dus best elke column eerst controleren op Null-waarden, en die netjes afhandelen (wat je ermee doet hangt af van je requirements: stuur je 'null', '0', een lege string, ...? wellicht moet dat dus ook een parameter worden van je functie).

Daarnaast is het ook mogelijk dat die lege insertrow op het einde wordt uitgeschakeld. In dat geval zal jouw functie de laatste row niet meenemen, die in dit geval een gewone datarow is met gegevens die je wél wilt meenemen (wat op dat moment wellicht lastig te debuggen zal zijn).

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • 430xlkod
  • Registratie: Januari 2007
  • Laatst online: 05-07 23:11
Klopt, daar geef ik je gelijk in. Ik wil ook enkel maar dat de basis werkt en dan optimaliseer ik van daaruit. De NullPointerException fouten hadden nu ook al moeten komen, omdat de eerste 10 rijen niet in elke Cell een waarde hebben zitten, dus dat zit wel al goed.

Wat betreft de lege insertrow op het einde, daar moet ik inderdaad een controle nog op maken.
Pagina: 1