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
다음 시도하고 실패한 경우를 참조하십시오.