我使用查询结果生成DataGridView。 该查询生成大量列(超过75个)。显然,DataGridView并没有显示所有这些内容。
我写了一个小程序,从DataGridView中提取数据并生成一个Excel文件或.csv文件。
我觉得有趣的是Excel和.csv都是正确生成的,除了列标题!我的意思是:所有CELLS都写入文件EXCEPT以获取列标题。
然后我发现如果DataGridView没有显示列标题,它就不会设置它们的值。
所以我编写了以下可怕的代码来水平滚动DataGridView,以便在DataGridView中显示列标题并提取到Excel或.csv工作:
Friend Sub ScrollTheGridToSeeColumnHeaders(ByRef dgvTheGrid As DataGridView)
If dgvTheGrid.RowCount = 0 Then
Exit Sub
End If
dgvTheGrid.SuspendLayout()
For i32ScorriCol As Int32 = 0 To dgvTheGrid.ColumnCount - 1 Step dgvTheGrid.DisplayedColumnCount(True)
dgvTheGrid.FirstDisplayedScrollingColumnIndex = dgvTheGrid.Columns(i32ScorriCol).Index
dgvTheGrid.Refresh()
Next
dgvTheGrid.ResumeLayout()
dgvTheGrid.CurrentCell = dgvTheGrid(0, 0)
End Sub
这样可行,但对用户的影响实在太可怕了(他看到网格滚动到最后并认为他犯了一些错误......)。
如果没有所有这些列以如此糟糕的方式滚动,你有没有建议去做这个技巧?
非常感谢提前!
答案 0 :(得分:1)
这似乎是一项非常多的不必要的工作。在我的一个应用程序中,我有一个datagridview,我为用户提供了“复制到excel”的能力。代码非常简单。用户从datagridview中选择他们想要的所有行(当然,代码可以调整为只选择每一行),然后按“copy to excel”,然后打开一个新的excel doc并粘贴整个选定的datagridview in,header和all。
以下是代码:
Try
'Copy to the clipboard
Clipboard.SetDataObject(Me.dgvTable.GetClipboardContent())
Catch ex As Exception
MsgBox("Clipboard could not be accessed. Please try again.", MsgBoxStyle.Critical)
End Try
'Create excel objects
Dim oExcel As Object
Dim oBook As Object
oExcel = CreateObject("Excel.Application")
oExcel.Visible = True
oBook = oExcel.Workbooks.Add
'Paste the stuff in
oBook.Worksheets(1).Range("A1").Select()
oBook.Worksheets(1).Paste()
希望这有点帮助!