lxlox schrieb:
Deine Aussage: "trenne immer UI und Daten" hat mich zum nachdenken angeregt.
Ich bitte dich inständig dieses "Zitat" weitestgehend aus deinem Gedächtnis zu streichen
Trennung von UI und Daten meint etwas komplett anderes. Mit deinem Problem hat das rein gar nichts zu tun. Nichtsdestotrotz hat Sheldon halbwegs recht, wenn er dir dazu rät alle Operationen auf einer separaten Variable zu erledigen und diese dann deiner Control zuzuweisen. (Auch wenn seine Begründung nicht ganz korrekt ist)
Kurz zur Erklärung. Weiter oben wurde schon das Thema mit dem TextChangedEvent angerissen. Das ist ein Ereignis, dass ausgelöst wird, wenn sich der Inhalt der RTB ändert. Das ganze passiert innerhalb der Klasse RichTextBox. Auf was ich hinaus will: wenn du innerhalb einer Schleife immer wieder einen Setter einer Klasse aufrufst, musst du davon ausgehen, dass innerhalb dieser Klasse irgendwas mit den neu gesetzten Daten passiert.
Manchmal ist das egal, manchmal will man das auf jeden Fall vermeiden und es gibt Szenarien, in denen es gewünscht ist.
Zu deinem jetzigen Problem.
Es scheint so als müsstest du dich auch nochmal ein wenig mit Schleifen beschäftigen
lxlox schrieb:
Code:
private void button1_Click(object sender, EventArgs e)
{
string[] hallo = {"1", "2", "3", "4"};
string amx = "";
richTextBox1.Text = "";
for (int i=0; i<hallo.Length; i++)
{
hallo[i] += i;
i++;
amx+=hallo[i]+"\n";
richTextBox1.Text = amx;
}
}
Hier sind gleiche mehrere Zeilen mehr oder weniger falsch.
Kannst du dir sparen, wenn du sowieso vor hast den Text zu überschreiben.
Hier das gleiche "Problem" wie in einem deiner vorherigen Posts. Du setzt das Text Property innerhalb der Schleife. Da passiert nichts weiter schlimmes, ausser das du unnötige Strings erzeugst.
Code:
hallo[i] += i;
i++;
amx+=hallo[i]+"\n";
Und hier liegt das eigentlich Problem.
Die erste Zeile kannst du direkt löschen (was auch immer du damit bezwecken möchtest), da die 2. Zeile dafür sorgt, dass du innerhalb der Schleife nicht mehr darauf zugreifst. Generell ist das nicht so eine brilliante Idee innerhalb einer For-Schleife die Zählvariable (i) zu manipulieren. Füg mal deinem Array 'hallo' ein weiteres Element hinzu und schau, was passiert
Evtl. kommst du selber drauf, wieso du das i nicht anrühren solltest. Als kleiner Tipp, schau dir mal den Schleifenkopf an.
Vorausgesetzt in der RTB soll 1\n2\n3\n4\n stehen, könntest du es mit einer For-Schleife so lösen.
Code:
private void button1_Click( object sender, EventArgs e )
{
string[] hallo = {"1", "2", "3", "4"};
string amx = "";
for ( int i = 0; i < hallo.Length; ++i )
{
amx += hallo[i] + "\n";
}
richTextBox1.Text = amx;
}
lxlox schrieb:
Code:
private void button1_Click(object sender, EventArgs e)
{
string[] hallo = {"1", "2", "3", "4"};
int i=0;
string amx = "";
richTextBox1.Text = "";
while (true)
{
try
{
hallo[i] += i + 0;
i++;
amx += hallo[i] + "\n";
richTextBox1.Text = amx;
}
catch
{ break; }
}
}
}
}
Nun, hier fehlen mir glatt die Worte
Den Fehler aus der 1. Schleife hast du hier entdeckt und durch die denkbar schlechteste Lösung behoben
Aber von vorne.
Zum einen ist die Bedingung
true nicht grade die beste, die du hättest nehmen können. Du hast ein Array mit einer abzählbaren Anzahl an Elementen, hier 4. Da bietet es sich doch an, auch nur 4 Schleifendurchläufe zu vollziehen
Code:
while( i < hallo.Length )
Code:
hallo[i] += i + 0;
i++;
amx += hallo[i] + "\n";
richTextBox1.Text = amx;
Gleiche Problem wie oben. Die zweite Zeile verhindert, dass die Erste irgendwo Verwendung findet. Weiterhin ist sie der Grund dafür, dass du eine Exception fangen musst (das meinte ich mit denkbar schlechteste Lösung). Im 4. durchlauf erhöhst du i auf 4 und somit bist du ausserhalb der Array-Grenzen. Try-Catch dient zur Fehlerbehandlung und nicht dazu, um aus einer unendlich laufenden Schleife auszusteigen
Ich geb dir einfach mal eine korrektere Lösung:
Code:
private void button1_Click( object sender, EventArgs e )
{
string[] hallo = {"1", "2", "3", "4"};
int i = 0;
string amx = string.Empty;
while ( i < hallo.Length )
{
amx += hallo[i] + "\n";
i++;
}
richTextBox1.Text = amx;
}
Auch hier wird nur 1\n2\n\3\n\4n in die RTB geschrieben.
Für den Fall, dass du noch die eine oder andere Zahl an jede Zeile anhängen möchtest, kannst du dir ja jetzt überlegen, wie du den Code ändern musst, damit es klappt.
Wenn du wirklich nur den Inhalt des Arrays in die RTB schreiben möchtest, kannst du das aber auch einfach haben.
string.Join wurde hier schon erwähnt.
Code:
private void button1_Click( object sender, EventArgs e )
{
string[] hallo = {"1", "2", "3", "4"};
richTextBox1.Text = string.Join( "\n", hallo );
}
Oder direkt ohne Array
Code:
private void button1_Click( object sender, EventArgs e )
{
richTextBox1.Text = string.Join( "\n", Enumerable.Range( 1, 4 ) );
}