Asp.net 重构:Gridview导出到CSV文件

Asp.net 重构:Gridview导出到CSV文件,asp.net,vb.net,gridview,refactoring,Asp.net,Vb.net,Gridview,Refactoring,这些例程(vb.net)允许您将gridview转储到CSV,即使单元格中有模板控件。这很管用,但我对它不感兴趣 我应该做哪些改进?为什么 Private Shared Function CsvFormatted(ByVal t As String) As String If t.Contains(",") Then t = """" + t + """" End If Return t.Replace("\ ", "") End Fu

这些例程(vb.net)允许您将gridview转储到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
  • 除了不间断的空格外,您是否应该担心去掉其他HTML文本?你可以用
  • 您的CsvFormatted例程可以针对空输入字符串进行修改—安全性几乎不需要任何成本
  • 你需要通过考试吗?一些国家/地区使用分号作为CSV分隔符。您可能还需要将点或逗号作为十进制分隔符
  • 我可能会将生成CSV字符串与发出HttpContext响应分离为单独的函数
  • 我可能使用vbCrLf而不是vbCr&vbLf
我的主要建议是:创建一些好的单元测试,确保代码通过,然后忘记它,然后继续实现更多的功能。代码封装得相当好,因此如果您认为有必要,可以在将来轻松重构。

  • 除了不间断的空格外,您是否应该担心去掉其他HTML文本?你可以用
  • 您的CsvFormatted例程可以针对空输入字符串进行修改—安全性几乎不需要任何成本
  • 你需要通过考试吗?一些国家/地区使用分号作为CSV分隔符。您可能还需要将点或逗号作为十进制分隔符
  • 我可能会将生成CSV字符串与发出HttpContext响应分离为单独的函数
  • 我可能使用vbCrLf而不是vbCr&vbLf

我的主要建议是:创建一些好的单元测试,确保代码通过,然后忘记它,然后继续实现更多的功能。代码封装得相当好,因此如果您认为有必要,可以在将来轻松重构。

btw,我如何让so编辑器识别Return t.Replace(“,”)?顺便问一下,我如何让so编辑器识别Return t.Replace(“,”)?