| 

.NET C# Java Javascript Exception

5
Ich habe folgendes Problem: ein Textfeld in meiner Tabelle (Type text) kann manchmal einen String mit mehreren Zeilen enthalten. Egal, wie viele Zeilen, der Inhalt soll in eine ListBox sichtbar sein. Ich bin der Lösung relativ nahe mit

string = DataRow.Item("feld")
Dim multi() as String = string.Split(vbCrLf)
ListBox.Items.AddRange(multi)

Aber ich bekomme in der Listbox ab der zweiten Zeile als erstes Zeichen immer ein Quadrat angezeigt. Ich habe das vbCrLf schon durch vbCr, vbLf, chr(13) & chr(10), chr(10) & chr(13) ersetzt. Der Effekt ist nur, dass sich das Quadrat unter Umständen als letztes Zeichen in einer Zeile einfügt.

Hat jemand einen Tipp für mich?
14.10.2011
muffi 1,4k 1 9
6 Antworten
3
Zwischen dem ollen Microsoft.VisualBasic.Strings.Split und System.String.Split besteht ein Unterschied.

Ersteres verhält sich VB-abwärtskompatibel so, dass es die Separator-Zeichen als block zum Splitten verwendet und somit aus der Liste entfernt.

Letzteres verwendet jedes Separator Zeichen gleichgewichtig, d.h. es splittet bei Angabe zweier Character sowohl nach dem ersten als auch nach dem zweiten Char. Da vbCrLf bzw. System.Envirmonment.NewLine ein String ist, wird lediglich der ersten Character des Strings verwendet.

Du kannst erstere Methode verwenden, allerdings sollte man so wenig spezifische Sprachfeatures wie möglich verwenden.

Ganz richtig machst du es so:
Dim crlf As Char() = New Char() {Chr(13), Chr(10)}
Dim str As String() = ("Das ist" & vbCrLf & "das Haus" & vbCrLf & "vom Nikolaus") _
.Split(crlf, StringSplitOptions.RemoveEmptyEntries)


Diese Anweisung teilt den String nach vbCr und vbLf, die Teile zwischen vbCr und vbLf werden Bestandteil des Array als Leerstrings. Durch die angabe der StringSplitOption kannst du die dann ausschließen.
17.10.2011
McZ 56 1
Das gibt den grünen Haken - macht genau das, was es soll ohne Workarounds. Danke!
muffi 17.10.2011
1
Hallo muffi,

schau Dir mal im Debugger den char des Quadrats an (als Zahlenwert). Ich vermute, es ist immer derselbe (nämlich 0). Vielleicht lässt das einen Rückschluss zu, wo es herkommt, bzw. was es für ein Zeichen ist und warum es dort ist. Eine 0 könnte ich mir als Terminierungszeichen erklären.

Gruß
Florian
14.10.2011
ffordermaier 8,4k 3 9
Hex war natürlich eine gute Idee. Dort sieht man 0D und 0A - das heißt im Umkehrschluss, dass .Split(chr(13) & chr(10)) nicht funktioniert - zumindest in VB.Net 2005. Ich tappe momentan total im Dunkeln...
muffi 14.10.2011
Vlt. versteh ich grad auch was falsch aber hex 0D = dez 13 und hex 0A = dez 10, d.h. der Split sollte schon so funktionieren. Du meintest doch, dass nach dem Split noch ein Quadrat übrigbleibt, welcher char ist das denn?
ffordermaier 14.10.2011
1
Gerade mal in der MSDN nachgesehen: http://msdn.microsoft.com/de-de/library/system.string.split%28v=vs.80%29.aspx

Das sind immer Arrays als Seperator. Vielleicht probierst Du das mal?
Dim stringSeparators() As String = {vbCrLf}
14.10.2011
Xantiva 2,3k 2 9
Xantiva 2,3k 2 9
0
Was passiert denn, wenn du anstatt vbCrLf etc. mal Environment.NewLine nimmst?
14.10.2011
Karill Endusa 1,5k 1 9
Dann ist das Quadrat am Anfang der Zeile.
muffi 14.10.2011
0
Ich habe das mal in C# versucht, weil ich VB nur sehr bruchstückhaft kann. Da kriege ich es problemlos hin. Hmmm...
Wie wäre es denn, wenn du nach dem Split noch einmal durch alle Elemente des Arrays gehst und das erste Zeichn wegnimmst (substring(1))?
14.10.2011
KN 1,7k 1 8
Funktioniert als workaround, ist aber natürlich nicht so befriedigend, weil man die Ursache ja immer noch nicht kennt / behebt / beheben kann.
muffi 14.10.2011
ja, da hast du recht.
KN 14.10.2011
0
Hallo,
das Quadrat ist doch schon vor dem Split drin, oder?
Ich würde es dann einfach erstezen:

  • string.Replace(vbCr, "")
  • string.Replace(vbLf, "")

je nachdem, welches Zeichen es ist.

Liebe Grüße, Tom
14.10.2011
Metal-Frog 936 1 7

Stelle deine .net-Frage jetzt!