Fragensteller
Tabellarische Daten über Zwischenablage in DataGridView einfügen

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 StringIf 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))
NextNext
- Typ geändert Robert Breitenhofer Freitag, 6. April 2012 12:06 Keine Rückmeldung des Fragenstellender
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/
- Bearbeitet Tom Lambert (Koopakiller) Sonntag, 25. März 2012 19:03 Bild eingefügt
-
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 -
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
-
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/
-
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 ClRfUnd 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/
-
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/
-
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 -
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/
-
****************************************************************************************************************
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
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.