0

私はSilverlightでいくつかのデータグリッドをエクスポートして優れたものにしようと試みてきましたが、これまでのところ成功していません。だから今私はそれらをExcelで開くことができるcsvファイルとしてエクスポートさせようとしています。データグリッドをエクスポートするために作成されたクラスがあり、csvファイルをエクスポートして保存します。ただし、csvファイルにはデータが含まれていません。

Imports System.IO

Public Class clsExportData
   'Public Shared Sub Export(dg As DataGrid)
   '    SaveExportedGrid(ExportDataGrid(True, dg))
   'End Sub


Public Shared Sub Export(dg As DataGrid, withHeaders As Boolean)
    SaveExportedGrid(ExportDataGrid(withHeaders, dg))
End Sub

Private Shared Sub SaveExportedGrid(data As String)
    Dim sfd As New SaveFileDialog()
    sfd.DefaultExt = "csv"
    sfd.Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*"
    sfd.FilterIndex = 1

    If If(sfd.ShowDialog(), False) Then
        Using sr As New StreamWriter(sfd.OpenFile())
            sr.Write(data)
        End Using
    End If
End Sub

Private Shared Function ExportDataGrid(withHeaders As Boolean, grid As DataGrid) As String
    Dim colPath As String
    Dim propInfo As System.Reflection.PropertyInfo
    Dim binding As System.Windows.Data.Binding
    Dim strBuilder As New System.Text.StringBuilder()
    Dim source As System.Collections.IList = TryCast(grid.ItemsSource, System.Collections.IList)
    If source Is Nothing Then
        Return ""
    End If

    Dim headers As New List(Of String)()
    grid.Columns.ToList().ForEach(Function(col)
                                      If TypeOf col Is DataGridBoundColumn Then
                                          headers.Add(FormatCSVField(col.Header.ToString()))
                                      End If

                                  End Function)
    strBuilder.Append([String].Join(",", headers.ToArray())).Append(vbCr & vbLf)

    For Each data As [Object] In source
        Dim csvRow As New List(Of String)()
        For Each col As DataGridColumn In grid.Columns
            If TypeOf col Is DataGridBoundColumn Then
                binding = TryCast(col, DataGridBoundColumn).Binding
                colPath = binding.Path.Path
                propInfo = data.[GetType]().GetProperty(colPath)
                If propInfo IsNot Nothing Then
                    csvRow.Add(FormatCSVField(propInfo.GetValue(data, Nothing).ToString()))
                End If
            End If
        Next
        strBuilder.Append([String].Join(",", csvRow.ToArray())).Append(vbCr & vbLf)
    Next

    Return strBuilder.ToString()
End Function

Private Shared Function FormatCSVField(data As String) As String
    Return [String].Format("""{0}""", data.Replace("""", """""""").Replace(vbLf, "").Replace(vbCr, ""))
End Function

エンドクラス

4

1 に答える 1

1

代わりに次を試してください

Dim source As System.Collections.IEnumerable = TryCast(grid.ItemsSource, System.Collections.IEnumerable)
If source Is Nothing Then
    Return ""
End If

また、デバッガーを使用してコードをステップ実行し、失敗した場所を確認してください。

于 2012-05-06T06:42:28.520 に答える