Vb.net 在不滚动整个网格的情况下获取DataGridView ColumnHeaders值

Vb.net 在不滚动整个网格的情况下获取DataGridView ColumnHeaders值,vb.net,datagridview,export-to-excel,export-to-csv,Vb.net,Datagridview,Export To Excel,Export To Csv,我使用查询结果生成DataGridView。 该查询生成许多列(超过75列)。显然,DataGridView并没有显示所有这些内容 我编写了一个小程序,从DataGridView中提取数据并生成一个Excel文件或.csv文件 我觉得有趣的是,除了列标题之外,Excel和.csv都是正确生成的!我的意思是:除列标题外,所有单元格都写入文件 然后我发现,如果DataGridView不可视化列标题,它将不会设置它们的值 因此,我编写了以下可怕的代码来水平滚动DataGridView,以便在DataG

我使用查询结果生成DataGridView。 该查询生成许多列(超过75列)。显然,DataGridView并没有显示所有这些内容

我编写了一个小程序,从DataGridView中提取数据并生成一个Excel文件或.csv文件

我觉得有趣的是,除了列标题之外,Excel和.csv都是正确生成的!我的意思是:除列标题外,所有单元格都写入文件

然后我发现,如果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
这是可行的,但对用户的影响是非常可怕的(他看到网格滚动到最后,认为他犯了某种严重的错误…)

你有没有建议在不让所有这些列以如此可怕的方式滚动的情况下进行此操作


非常感谢

这似乎是一大堆不必要的工作。在我的一个应用程序中,我有一个datagridview,我为用户提供了“复制到excel”的功能。代码非常简单。用户从datagridview中选择他们想要的所有行(当然,代码可以调整为只选择每一行),然后按“复制到excel”,它会打开一个新的excel文档,并将整个选定的datagridview粘贴到、标题和全部中

代码如下:

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()

希望这有点帮助

DataGridView是否绑定到类似数据集的对象?它从哪里获取数据?DatagridView未绑定。它由来自从SQL Server DB读取数据的DataReader的数据构造而成。当最终用户决定进行提取时,DataReader将关闭。真的:一段非常好的代码。但这并不能解决我的“问题”:我的网格包含超过75个字段,我需要向用户提供提取所有字段的能力。选择75列和(可能)超过1000行是不“用户友好的”:-)与其让用户选择要复制到excel的行/列,为什么不以编程方式进行,并为用户选择它们?在我的程序的另一部分中,我让用户按你说的做。如果用户选择足够数量的字段来显示,问题仍然存在:在网格显示列标题之前,列标题不会报告给Excel。还有另一种选择:让用户选择网格上的列,但这需要花费太长的时间。如果粘贴两次会怎么样?首先,选择适当的标题,并通过执行oBook.Worksheets(1).Range(“A1”).select()然后.paste()粘贴。。。然后选择用户选择的内容并执行oBook.Worksheets(1).Range(“B1”).select和finally.Paste()?感谢您的关注,但我需要解决标题未“刷新”的问题:一些网格需要FullRowSelect,在这种情况下,您无法选择ColumnHeader。