Рефакторинг: Gridview Экспорт в файл CSV - PullRequest
1 голос
/ 15 сентября 2009

Эти подпрограммы (vb.net) позволяют создавать дамп сетки в CSV, даже если в ячейках есть шаблонные элементы управления. Это работает, но я не в восторге от этого.

Какие улучшения я должен сделать и почему?

Private Shared Function CsvFormatted(ByVal t As String) As String
    If t.Contains(",") Then
        t = """" + t + """"
    End If
    Return t.Replace("\ ", "")

End Function

Private Shared Function GetCellText(ByVal cell As DataControlFieldCell) As String
    If cell.Controls.Count = 0 Then
        Return CsvFormatted(cell.Text)
    Else
        For Each current In cell.Controls
            If TypeOf current Is Label Then
                Return CsvFormatted(TryCast(current, Label).Text)
            ElseIf TypeOf current Is TextBox Then
                Return CsvFormatted(TryCast(current, TextBox).Text)
            ElseIf TypeOf current Is LinkButton Then
                Return CsvFormatted(TryCast(current, LinkButton).Text)
            ElseIf TypeOf current Is ImageButton Then
                Return CsvFormatted(TryCast(current, ImageButton).AlternateText)
            ElseIf TypeOf current Is HyperLink Then
                Return CsvFormatted(TryCast(current, HyperLink).Text)
            ElseIf TypeOf current Is DropDownList Then
                Return CsvFormatted(TryCast(current, DropDownList).SelectedItem.Text)
            ElseIf TypeOf current Is CheckBox Then
                Return CsvFormatted(If(TryCast(current, CheckBox).Checked, "True", "False"))
            End If
        Next
    End If
    Return ""
End Function

Public Shared Sub ExportGridViewToCSV(ByVal grid As GridView, ByVal fileName As String)
    HttpContext.Current.Response.Clear()
    HttpContext.Current.Response.Buffer = True
    HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + fileName)
    HttpContext.Current.Response.Charset = ""
    HttpContext.Current.Response.ContentType = "application/text"
    Dim sb As New StringBuilder()
    For k As Integer = 0 To grid.Columns.Count - 1
        grid.Columns(k).Visible = True
        'add separator
        sb.Append(grid.Columns(k).HeaderText + ","c)
    Next
    'append new line
    sb.Append(vbCr & vbLf)
    For i As Integer = 0 To grid.Rows.Count - 1
        For k As Integer = 0 To grid.Columns.Count - 1
            grid.Columns(k).Visible = True
            'add separator
            sb.Append(GetCellText(grid.Rows(i).Cells(k)) + ","c)
        Next
        'append new line
        sb.Append(vbCr & vbLf)
    Next
    HttpContext.Current.Response.Output.Write(sb.ToString())
    HttpContext.Current.Response.Flush()
    HttpContext.Current.Response.End()
End Sub

1 Ответ

1 голос
/ 15 сентября 2009
  • Стоит ли беспокоиться об удалении других литералов HTML, кроме неразрывного пробела?Вы можете использовать HttpUtility.HtmlDecode .
  • Ваша подпрограмма CsvFormatted может защитить от нулевых входных строк - безопасность почти ничего не стоит.
  • Вам нужно пройти тест Турция ?Некоторые страны используют точку с запятой в качестве разделителя CSV.Вам также может понадобиться учитывать точки или запятые в качестве десятичного разделителя.
  • Я мог бы отделить построение строки CSV в отдельную функцию от выдачи ответа HttpContext.
  • Я мог бы использовать vbCrLf вместо vbCr & vbLf.

Мой главный совет: создайте несколько хороших модульных тестов, убедитесь, что код прошел, затем забудьте о нем и переходите к реализации некоторых дополнительных функций.Код довольно хорошо инкапсулирован, поэтому вы можете легко выполнить рефакторинг в будущем, если решите, что это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...