グリッド全体をスクロールせずにDataGridView ColumnHeaders値を取得する

私は、クエリの結果を使用してDataGridViewを生成します。 クエリは、多くの列(75以上)を生成します。明らかに、DataGridViewはそれらのすべてを表示しません。

私はDataGridViewからデータを抽出し、Excelファイルまたは.csvファイルを生成する小さな手順を書いた。

面白いのは、Excelと.csvの両方が列見出しを除いて正しく生成されていることです。つまり、ALL CELLSは列見出しのファイル以外に書き込まれます。

私は、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
DataGridViewは、DataSetのようなものにバインドされていますか?データはどこにありますか?
追加された 著者 Casey Wilkins,
DatagridViewはバインドされていません。これは、SQL Server DBからデータを読み取るDataReaderからのデータから構築されます。 EndUserが抽出を行うことを決定すると、DataReaderは閉じられます。
追加された 著者 Andrea Antonangeli,

1 答え

これは非常に多くの不必要な作業のようです。私のアプリケーションの1つでは、私はdatagridviewを持っています。そして、私は "コピーするExcel"をユーザに提供します。コードはかなり簡単です。ユーザーは、データグリッドビューから必要な行をすべて選択します(もちろん、各行を1つだけ選択するようにコードを微調整することもできます)。「コピーしてExcel」を押すと、新しいExcel文書が開き、選択したデータグリッドビュー全体がペーストされますイン、ヘッダー、すべて。

コードは次のとおりです:

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

これは少し助けてほしい!

1
追加された
ユーザーがExcelにコピーする行/列を選択させるのではなく、プログラマチックにその行を選択してユーザーに選択させるのはなぜでしょうか?
追加された 著者 Boeckm,
2回貼り付けたら?まず、適切なヘッダーを選択し、oBook.Worksheets(1).Range( "A1")を実行して貼り付けます。次にSelect()および.Paste()...次に、ユーザーが選択したものを選択し、oBook.Worksheets )。Range( "B1")。最後に.Paste()を選択しますか?
追加された 著者 Boeckm,
本当に素晴らしいコードです。しかし、それは私の "問題"を解決しません:私のグリッドは75以上のフィールドが含まれており、私はユーザーにそれらのすべてを抽出する能力を提供する必要があります。 75列と1000行以上を選択することは、「ユーザーフレンドリー」ではありません:-)
追加された 著者 Andrea Antonangeli,
私のプログラムの別の部分では、私はユーザーにあなたの言うことをさせる。ユーザーが表示するのに十分な数のフィールドを選択した場合、問題は依然として残ります。列見出しは、グリッドが表示されるまでExcelに報告されません。もう一つの選択肢があります:ユーザーがグリッド上の列を選択させるようにしますが、これは時間がかかりすぎます。
追加された 著者 Andrea Antonangeli,
関心をお寄せいただきありがとうございますが、私はヘッダーが "リフレッシュされていない"という問題を解決する必要があります。私はFullRowSelectでなければならないグリッドがあります。そのような場合、ColumnHeadersを選択することはできません。
追加された 著者 Andrea Antonangeli,