代码之家  ›  专栏  ›  技术社区  ›  BenB

重构:GridView导出到csv文件

  •  1
  • BenB  · 技术社区  · 16 年前

    这些例程(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
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   MarkJ    16 年前
    • 除了不间断的空格外,您还应该担心取消其他HTML文本的换行吗?你可以使用 HttpUtility.HtmlDecode .
    • 你的CSV格式程序可以 guard 对于空输入字符串-它几乎不需要花费任何代价来保证安全。
    • 你需要通过 Turkey test ?有些国家使用分号作为csv分隔符。您可能还需要将点或逗号解释为十进制分隔符。
    • 我可能会将构建csv字符串与发布httpContext响应分离成单独的函数。
    • 我可能使用vbcrlf而不是vbcr&vblf。

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

    推荐文章