2016-11-28 17 views
0

DataGridviewに保持されているデータのエクスポートを高速化するため、このフォーラムでは、datagridviewの内容をクリップボードにコピーする方法を提案しています。アプリケーションがExcelと通信しなければならない時間を削減するために、Excelスプレッドシートに貼り付けます。プログラムですべてを選択した後にdatagridviewの選択

これはうまくいきますが、ユーザーがdatagridviewで特定のセルを選択した場合、datagridview.SelectAll()メソッドを使用するため、この選択が失われる可能性があります。

私はExcelにエクスポートするユーザーのオリジナルの選択ポストを再選択する簡単な解決策を見つけることを望んでいました。私は、次のことを試してみました:

Dim mySelection As DataGridViewSelectedCellCollection 

    mySelection = myDataGridView.SelectedCells 

    ExportToExcel(myDataGridView, "Exported Data") 

    myDataGridView.SelectedCells = mySelection 

私はむしろ、選択したセルの位置よりも、選択内に保持されたデータについてであるように思わとしてDataGridViewSelectedCellCollectionが、ここで使用する正しいものではないことを疑います。

代わりに、SelectAll()を使用せずにすべてのdatagridviewをクリップボードに取り込む方法がありますか?

Excelのコードに必要なエクスポートがここにある場合:

Private Sub ExportToExcel(myDataGridView As DataGridView, myWorksheetName As String) 

    ' Creating a Excel object. 
    Dim excel As Microsoft.Office.Interop.Excel._Application = New Microsoft.Office.Interop.Excel.Application() 
    Dim workbook As Microsoft.Office.Interop.Excel._Workbook = excel.Workbooks.Add(Type.Missing) 
    Dim xlWorkSheet As Microsoft.Office.Interop.Excel._Worksheet = Nothing 

    Try 

     xlWorkSheet = workbook.ActiveSheet 

     xlWorkSheet.Name = myWorksheetName 


     'Data transfer from grid to Excel. 
     With xlWorkSheet 
      .Range("1:1").EntireRow.Font.Bold = True 
      'Set Clipboard Copy Mode  
      myDataGridView.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText 
      myDataGridView.SelectAll() 

      'Get the content from Grid for Clipboard  
      Dim str As String = TryCast(myDataGridView.GetClipboardContent().GetData(DataFormats.UnicodeText), String) 

      'Set the content to Clipboard  
      Clipboard.SetText(str, TextDataFormat.UnicodeText) 

      'Identify and select the range of cells in Excel to paste the clipboard data.  
      .Range("A1").Select() 

      'Paste the clipboard data  
      .Paste() 
      Clipboard.Clear() 
     End With 

     'Getting the location and file name of the excel to save from user. 
     Dim saveDialog As New SaveFileDialog() 
     saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx" 
     saveDialog.FilterIndex = 2 

     If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then 
      workbook.SaveAs(saveDialog.FileName) 
      MessageBox.Show("Export Successful") 
     End If 
    Catch ex As System.Exception 
     MessageBox.Show(ex.Message) 
    Finally 
     excel.Quit() 
     workbook = Nothing 
     excel = Nothing 
    End Try 

End Sub 
+0

[MSDN]によると、(https://msdn.microsoft.com/en-us/library/system.windows.forms .datagridview.selectedcells(v = vs.110).aspx)、SelectedCellsプロパティは読み込み専用であるため、使用する正しいものではありません。適切な代替案を提案するには、私は 'ExportToExcel()'のコードを見る必要があると思います。 – vbnet3d

+0

私はこれを追加しました。元の質問で言及したような重要なポイントは、 myDataGridView.SelectAll() 'を呼び出すと、datagridviewの内容をクリップボードに追加し、ユーザの選択を上書きします。 –

+1

私はそれを見ると、1)再びセルを再選択しようとするか(2)セルを反復するなど、セルの選択に依存しないものにエクスポートロジックを変更するか、値をStringBuilderに渡し、そのテキストをクリップボードにコピーする、または3)ライブラリを使用するか、CSVをエクスポートしてクリップボードを完全に使用しないようにします。 – vbnet3d

答えて

1

あなたが選択を変更せずにDataGridViewの内容をコピーすることができます。タブ区切りのUnicode文字列を組み立てるとClipBoardにそれを押すことによってこれを行います。

Sub CopyDataGridViewToClipboard(dgv As DataGridView, includeHeader As Boolean) 
    Dim sbl As New System.Text.StringBuilder 
    If includeHeader Then 
     For intCol As Integer = 0 To dgv.Columns.Count - 1 
     Dim dgvc As DataGridViewColumn = dgv.Columns(intCol) 
     If intCol > 0 Then sbl.Append(vbTab) 
     sbl.Append(dgvc.HeaderText) 
     Next intCol 
     sbl.AppendLine() 
    End If 
    For intRow As Integer = 0 To dgv.Rows.Count - 1 
     Dim dgvr As DataGridViewRow = dgv.Rows(intRow) 
     For intCol As Integer = 0 To dgv.Columns.Count - 1 
     If intCol > 0 Then sbl.Append(vbTab) 
     sbl.Append(dgvr.Cells(intCol).Value) 
     Next intCol 
     sbl.AppendLine() 
    Next intRow 
    Clipboard.SetText(sbl.ToString, TextDataFormat.UnicodeText) 
    End Sub 
+0

両方のソリューションが機能しますが、私はこれを答えとして選択しました。これはユーザーに選択の変更が見られることを避けるため、全体のエクスポートプロセスはあまり「不器用」と感じます。 –

1

DGV.SelectedCellsが読み取り専用であるので、私はあなたがちょうどあなたがいっぱいやっている場合を除き(個別trueに、各セルの選択したプロパティを設定する必要がかもしれないと思います行/列選択)。あなたは自分の選択したセルのコレクションを反復処理し、それぞれを再選択できます。

myDataGridView.ClearSelection() 
If mySelection IsNot Nothing Then 
    For Each dgvCell As DataGridViewCell In mySelection 
     dgvCell.Selected = True 
    Next 
    mySelection = Nothing 
End If 
関連する問題