这些例程(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
答案 0 :(得分:1)
我的主要建议:创建一些好的单元测试,确保代码通过,然后忘记它,然后继续实现更多功能。代码封装得相当好,所以如果您认为有必要,可以在以后轻松进行重构。