2012-05-05 3 views
0

Silverlight에서 일부 DataGrid를 내보내려고했지만 지금까지 성공하지 못했습니다. 그래서 지금 나는 단지 CSV 파일로 내보낼 수있게하려고 노력하고 있습니다. 그러면 그 파일을 Excel에서 열 수 있습니다. DataGrid를 내보내려면 클래스를 만들고 CSV 파일을 내보내고 저장합니다. 그러나 csv 파일에는 데이터가 없습니다.Silverlight의 DataGrid 용 CSV 내보내기 클래스

답변

1

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 

최종 클래스 당신이 디버거를 사용하여 코드를 단계별로 위해선, 대신

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

다음 시도하고 실패한 경우를 참조하십시오.