Datagrid in Zwischenablage (Clipboard) kopieren

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Lubeca.

    Datagrid in Zwischenablage (Clipboard) kopieren

    Hallo zusammen,

    Ich glaube ich stehe beim Programmieren im Moment etwas auf dem Schlauch.

    Mein Problem ich würde gerne den kompletten Inhalt samt Überschriften des Datagrids in eine Excel-Tabelle kopieren.

    Das einfügen ist kein Problem, das habe manuell (markieren der Zellen und "Strg + C") getestet. Nur bekomme ich das Datagrid mit keinem Code nicht in die Zwischenablage.

    Bei einem Datagridview von Windows Forms gab es noch den Befehl getClipboardContent.

    Was muss ich im Code anstatt des " * " schreiben?

    VB.NET-Quellcode

    1. TestGrid.SelectAllCells()
    2. Clipboard.SetDataObject(TestGrid.*)



    Tschüßi Lubeca

    Habe zwar eine komplizierte Lösung, suche aber trotzdem noch etwas Kürzeres

    Ich habe jetzt etwas ausprobiert und bisher (im Einzelschritt-Debugmodus) funktioniert es.
    Ich habe das Datagrid ja in einem Dataset. Dieses verbinde ich mit einem DataTable und daraus kann ich alle Spalten- und Zeilen-Inhalte nacheinander auslesen und durch Tabs getrennt in einen String schreiben. Den String kopiere ich in die Zwischenablage und füge ihn mit Paste in Excel ein. Etwas kompliziert aber klappt.
    Wenn das auch im kompletten Programmablauf geht, poste ich auch den Code gerne.

    Tschüßi Lubeca

    Quell-Code zum Kopieren eines DataSet in eine Excel-Datei

    Hier, wie versprochen, der funktionierende Code:
    Verweise:

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic
    2. Imports Excel = Microsoft.Office.Interop.Excel
    3. Imports System.Windows.Controls
    4. Imports System Data
    5. Imports System.Data.OleDB

    Code-Teil in der Hauptprozedur:

    VB.NET-Quellcode

    1. Dim Datentabelle As DataTable = Nothing
    2. Datentabelle = objDatensatz.Tables(0) ' Einlesen der Daten aus Dataset (objDatensatz) in die Datentabelle
    3. Clipboard.SetDatasetObject(TabelleToString(Datentabelle),True) ' Kopieren in die Zwischenablage
    4. direkt_Excel(QuelleExcel) ' Aufruf der Prozedur zum Kopieren in die Excel-Datei (QuelleExcel String-Variable)

    Funktion zum Umwandeln der Tabelle in eine String:

    VB.NET-Quellcode

    1. Private Function TabelleToString(Tabelle As DataTable) As String
    2. Dim DatenString As String = String.Empty
    3. Dim Trenn As String = String.Empty
    4. If Tabelle.Rows.Count > 0 Then
    5. ' Umwandeln der Überschriften
    6. For each c As DataColumn In Tabelle.Columns
    7. If c.DataType <> GetType(System.Guid) AndAlso c.DataType <> GetType(System.Byte()) Then
    8. DatenString += Trenn + c.ColumnName
    9. Trenn = vbTab
    10. End If
    11. Next
    12. DatenString += vbCrLf
    13. 'Umwandeln der Zeilen
    14. For Each r As DataRow In Tabelle.Rows
    15. Trenn = String.Empty
    16. For Each c As DataColumn In Tabelle.Columns
    17. If c.DataType <> GetType(system.Guid) AndAlso c.DataType <> GetType(System.Byte()) Then
    18. If not Convert.IsDBNull(r(c.ColumnName)) Then
    19. DatenString += Trenn & r(c.ColumnName).ToString()
    20. Else
    21. DatenString += Trenn & ""
    22. End If
    23. Trenn = vbTab
    24. End If
    25. Next
    26. DatenString += vbCrLf
    27. Next
    28. Else
    29. DatenString += vbCrLf & "Die Tabelle war leer!"
    30. End If
    31. Return DatenString
    32. End Function

    Einfügen in Excel:

    VB.NET-Quellcode

    1. Sub direkt_Excel(MeinPfad As String)
    2. Dim eApp = New Excel.Application() ' Excel-Instanz erzeugen
    3. eApp.Workbooks.Open(MeinPfad) ' vorhandene Datei öffnen
    4. With eApp
    5. .Range("A1",.Cells(.sheets(1).UsedRange.Rows.Count,.ActiveSheet.UsedRange.Columns.Count)).Select()
    6. .Selection.Delete()
    7. .Range("A1").Select()
    8. .ActiveSheet.Paste()
    9. .ActiveWorkbook.Save()
    10. .Workbooks.Close()
    11. .Quit()
    12. End With
    13. End Sub


    Es ist nicht die eleganteste Art, aber funktioniert.