none
Tabellarische Daten über Zwischenablage in DataGridView einfügen RRS feed

  • Allgemeine Diskussion

  • Hallo Forum,

    ich würde gerne tabellarische Daten (z. B. aus Excel) über die Zwischenablage in ein DataGridView einfügen.
    Die Erste Zeile sollen meine Namen / Beschriftungen für die Spalte/n sein.
    Jedoch komm noch nicht das gewünschte Ergebnis raus. Wer kann helfen? - Ich bin mir nicht ganz sicher, ob es an der dekleration hängt oder der Schleifensteuerung - jedenfalls sieht es mit den Überschriften (Spaltennamen) güt aus, bis er was aus der zweiten Zeile dabeimischt und die Zeilen splittet er garnicht, sondern mact alles in die 1. Spalte.



    Gruß
    Stefan

    MeinDatenbeispiel, das so im DataGrid ankommen soll:

    Nummer 130000 130010 130020
    1234567890123 1 5
    9876543021123 1 4 2


    Dim Zwischenablage As String

                If Clipboard.ContainsText() = True Then
                    Zwischenablage = Clipboard.GetText()

                    ' Zeilen trennen:
                    Dim Zwischenablage_Zeilen() As String = Split(Zwischenablage, vbNewLine)
                    Dim Zeilenanzahl As Byte = UBound(Zwischenablage_Zeilen)

                    ' Spalten einer Zeile trennen:
                    Dim Zwischenablage_Spalten() As String = Split(Zwischenablage, vbTab)
                    Dim Spaltenanzahl As Byte = UBound(Zwischenablage_Spalten)

                    For a As Integer = 0 To Spaltenanzahl
                        DataGridView_Filialverteiler.Columns.Add(Zwischenablage_Spalten(a), Zwischenablage_Spalten(a))

                        For b As Integer = 0 To Zeilenanzahl
                            DataGridView_Filialverteiler.Rows.Add(Zwischenablage_Zeilen(b))
                        Next

                    Next

    • Typ geändert Robert Breitenhofer Freitag, 6. April 2012 12:06 Keine Rückmeldung des Fragenstellender
    Sonntag, 25. März 2012 17:45

Alle Antworten

  • Also bei mir funktioniert es so:
    If Clipboard.ContainsText() Then
    	dataGridView1.Columns.Clear()
    	dataGridView1.Rows.Clear()
    
    	Dim c As Char() = {ControlChars.Lf, ControlChars.Tab}
    	Dim items As String() = Clipboard.GetText().ToString().Split(c)
    	Dim lines As String() = Clipboard.GetText().ToString().Split(ControlChars.Lf)
    
    	For i As Integer = 0 To lines.Length - 1
    		dataGridView1.Columns.Add(i.ToString(), items(i))
    	Next
    
    	For i As Integer = 0 To lines.Length - 2
    		If i <> 0 Then
    			dataGridView1.Rows.Add(lines(i).Split(ControlChars.Tab))
    		End If
    	Next
    End If
    Dabei wird die 1. Zeile als Spaltenüberschrift verwendet. Diese wird entsprechend nicht als Row eingefügt (If i <> 0 Then).

    Koopakiller - http://koopakiller.ko.ohost.de/


    Sonntag, 25. März 2012 18:59
  • Hallo@Koopakiller,

    vielen Dank für deinen Lösungsansatz. Es funktioniert schon ganz gut, aber in der Letzeten Spalten (wie auch in deinem Screenshot) sieht die Überschrift so aus, als ob noch ein Zeilenumbruch dahinter währe (ist licht verschoben) und in den Zeilen in der Letzten Spalte ist hinter jedem Wert auch noch ein | Zeichen - Was kann das noch sein? Wird da was anderes als Tab / LF verwendet?

    Hast du eine Idee, ob man ein anderes Zeichen angeben muss?


    Gruß
    Stefan

    Sonntag, 25. März 2012 19:38
  • Habe noch etwas experimentiert - wenn ich

    Dim Spalten As String() = Clipboard.GetText().ToString().Split(ControlChars.Tab, ControlChars.CrLf)

    für die Spalten verwende, sieht die Letzte Spalte auch "gut" aus.

    Probleme habe ich aber noch bei den Zeilen. Mit dem Code ist zwar das Zeichen hinter dem Wert in der Letzen Spalte weg, aber dafür ist alles verschoben bzw. noch leere Zeilen im DataGridView.
    Noch eine Idee, was man für die Zeilen angeben muss????

    Dim Zeilen As String() = Clipboard.GetText().ToString().Split(ControlChars.Lf, ControlChars.CrLf)


    Gruß

    Stefan

    Sonntag, 25. März 2012 19:54
  • Ich muss meinen Quellcode nochmal etwas korrigieren:

            If Clipboard.ContainsText() Then
                DataGridView1.Columns.Clear()
                DataGridView1.Rows.Clear()
    
                Dim c As Char() = {ControlChars.CrLf, ControlChars.Tab}
                Dim content As String = Clipboard.GetText().ToString()
                Dim items As String() = content.Split(c)
                Dim lines As String() = content.ToString().Split(ControlChars.CrLf)
    
                If items.Length <= 1 Then
                    DataGridView1.Columns.Add("0", items(0))
                Else
                    For i As Integer = 0 To ((items.Length - 1) \ (lines.Length - 1)) - 1
                        'If items(i) <> "" Then
                        DataGridView1.Columns.Add(i.ToString(), items(i))
                        'End If
                    Next
                End If
    
                For i As Integer = 0 To lines.Length - 2
                    If i <> 0 Then
                        DataGridView1.Rows.Add(lines(i).Split(ControlChars.Tab))
                    End If
                Next
            End If

    Ich hatte da einen grundsätzlichen Logikfehler drin. Man will ja die Items in einer Zeile als Spalten verwenden und nicht die Items der 1. Spalte. Außerdem benutze ich nun CrLf, also den Windows-Standart.

    Es ist jetzt auch etwas sicherer gegen Abstürtze (Wenn reine Texte eingefügt werden (ohne Tab und nicht Mehrzeilig)).


    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 25. März 2012 21:24
  • Es ist fast perfekt - bei mir kommen nur in der 1. Spalten vor den Werten (außer Spaltenüberschrift) noch ein Trennzeichen.
    Kommt das bei dir auch? Um was handelt es sich da? Kann ich das noch mit einem Remove wegbekommen?

    Gruß
    Stefan

    Montag, 26. März 2012 19:01
  • DSas ist seltsamm...

    Bei mir funktioniert es Problemlos. Vielleicht liegt es ja an der von dir Kopierten Tabelle? Excel 2010 kopiert es so in das Clipoard:

    Zelle Tab Zelle Tab Zelle ClRf
    Zelle Tab Zelle Tab Zelle ClRf
    Zelle Tab Zelle Tab Zelle ClRf

    Und so lese ich es ja auch im Bsp. Code aus. Vielleicht macht dein Programm aj noch diesem seltsamme Zeichen vor jede Zeile?

    PS: In dem Programm charmap (enthält eine Liste aller Zeichen) habe ich das Zwichen auch nicht finden können!?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Montag, 26. März 2012 19:34
  • Hallo,

    ich habe noch EXCEL 2003.
    Der HEX Editor erzählt mir das:
    E1300001300101300201234567890123159876543021123142

    Daten:

    Nummer 130000 130010 130020
    1234567890123 1 5
    9876543021123 1 4 2

    Hilft uns das noch weiter?


    Gruß
    Stefan

    Montag, 26. März 2012 20:01
  • Schwierig, damit kann ich auch nicht sowirklich etwas anfangen. Was mir geholfen hat, meinen Fehler zu entdecken, war einen BreakPoint an den Funktionsanfang zu setzen und dann mit F11 Zeile für Zeile weiter gemacht, wenn du mit der Maus über eine Variable Zeigst, bekommst du den Wert angezeigt (VS 2010 & 11(früher: kA)).

    Koopakiller - http://koopakiller.ko.ohost.de/

    Montag, 26. März 2012 20:08
  • Ich habe mir jetzt mal wie folgt beholfen - es scheint ein chr(10) zu sein:

    For i As Integer = 0 To Zeilen.Length - 2
        If i <> 0 Then
           If Zeilen(i).ToString.StartsWith(Chr(10)) = True Then
            DataGridView_Filialverteiler.Rows.Add(Zeilen(i).Remove(0, 1).Split(ControlChars.Tab))
           Else
            DataGridView_Filialverteiler.Rows.Add(Zeilen(i).Split(ControlChars.Tab))
           End If
        End If
    Next


    Gruß
    Stefan

    Mittwoch, 28. März 2012 19:36
  • Noch ne kleine Leistungssache:

    Lies den Inhalt anfangs in einen string ein und mache dann ein Replace:

            If Clipboard.ContainsText() Then
                DataGridView1.Columns.Clear()
                DataGridView1.Rows.Clear()
    
                Dim c As Char() = {ControlChars.CrLf, ControlChars.Tab}
                Dim content As String = Clipboard.GetText().ToString()
                content = content.Replace(Chr(10).ToString(), "")
                Dim items As String() = content.Split(c)
                Dim lines As String() = content.ToString().Split(ControlChars.CrLf)
    
                If items.Length <= 1 Then
                    DataGridView1.Columns.Add("0", items(0))
                Else
                    For i As Integer = 0 To ((items.Length - 1) \ (lines.Length - 1)) - 1
                        'If items(i) <> "" Then
                        DataGridView1.Columns.Add(i.ToString(), items(i))
                        'End If
                    Next
                End If
    
                For i As Integer = 0 To lines.Length - 2
                    If i <> 0 Then
                        DataGridView1.Rows.Add(lines(i).Split(ControlChars.Tab))
                    End If
                Next
            End If
    Ich weiß es zwar nicht sicher, aber das Chr(10) ist doch, glaub ich, das Leerzeichen!?

    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 28. März 2012 19:48
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 6. April 2012 12:05