C# Visual C# Probleme

DannyW

Well-known member
ID: 183268
L
20 April 2006
318
17
Hallo,
da ich Anfänger bin und öfter Probleme bei Visual C# (visual studio 2008 ) habe,
möchte ich hier öfters Fragen, wenn ich ein Problem habe.

Im Moment hab ich folgendes Problem:

Ich möchte, das in einer listbox ein Teil einer Zeile einer Textdatei ausgelesen wird,
dies funktioniert schonmal... nun möchte ich aber das in einer weiteren Textbox
der Benutzer quasi eine Lösung eingibt... nach Klick auf einen überprüfen button
soll dann geguckt werden ob der zweite teil aus der textdatei zum ersten teil
passt.


meine textdatei sieht im moment so aus:

text1#text2#0

Text 1 soll in der listbox erscheinen und als lösung soll text 2 eigegeben werden.

Wenn der Benutzer das richtige eingibt soll "richtig" ausgegeben werden und die 0 am ende hochgezählt werden,
wenn nich soll die ausgabe "falsch" erscheinen und auf 0 bleiben.

Danke schonmal für eure Hilfe... :)
 
mmh, ganz theoretisch und schnell gesagt
du ziehst dir erstmal im Designer eine listbox, textbox und nen button in dein fenster
dann sagst du sowas wie listbox.add("text1"), oder listbox.Items.add("text1") oder so ähnlich ("text1" ist natürlich zu ersetzen gegen eine Variable, in die du diesen ausgelsenen Text gepackt hast), um der Liste ein Element hinzuzufügen
dann machst du im designer nen doppelklick auf den button und du gelangst direkt in eine funktion, die aufgerufen wird wenn der user ihn klickt
dort machst du ne Abfrage ob die eingabe korrekt ist, auch wieder halb geraten:
PHP:
if(textbox.Text==text2)
{
  MessageBox.Show("Richtig");
  
  // an dieser Stelle dann diese Zahl erhöhen, indem datei neu beschrieben wird
}
else MessageBox.Show("Falsch");
das müsste es gewesen sein, halt bis auf das mit dem zahl erhöhen, ist aber auch net sehr schwer
 
so, wie toxic2 es beschrieben hat müsste es funktionieren , allerdings statt

PHP:
if(textbox.Text==text2)

dies hier:
PHP:
if(textbox.Text.Equals(text2))

Ich würde aber nicht nach jeder Frage die Zahl hochzählen, sondern intern und dann bei Beenden oder nach x Fragen die Zahl speichern.

Gruß
Dreamer
 
so, wie toxic2 es beschrieben hat müsste es funktionieren , allerdings statt

PHP:
if(textbox.Text==text2)

dies hier:
PHP:
if(textbox.Text.Equals(text2))

oh, bin zu sehr an PHP gewohnt, aber mein aktuelles C# Projekt beweist dass "==" auch als Vergleichsparameter für Strings dienen kann
PHP:
if ((string)comPortsList[i] == "simulate") continue;

muss aber dazu sagen dass z.B. unter Java die .equals() Methode besser funktioniert als ein Vergleich mit "==", weiß nciht wie gut das unter C# implementiert ist, hatte auf jeden Fall noch keine Probleme!
 
Mit dem Vergleichsoperator == vergleichst du nur Referenzen und nicht den eigentlichen Text. Der Text selbst wird mit der Funktion Equals verglichen.

Mal ein Beispiel:

PHP:
string s1 = "Test";
string s2 = "Test";
string s3 = new string("Test");

//s1 und s2 zeigen auf das selbe Objekt, da in C# keine Veränderung an Strings möglich ist.
//Deshalb gilt:

if(s1 == s2) // true
if(s1.Equals(s2)) //logischerweie auch true
if(s1 == s3) //false, du du mit new eine neues Objekt erzeugst hast
if(s1.Equals(s3) //true, da nur der Text verglichen Wert

Du kannst also ruhig if(textbox.Text==text2) verwenden, das klappt
 
Code:
private void check_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string line = sr.ReadLine();
string[] parts = line.Split('#');
string english = (parts[1]);
if (evokabel.Text == english)
{
MessageBox.Show("Richtig");
// an dieser Stelle dann diese Zahl erhhen, indem datei neu beschrieben wird}
else MessageBox.Show("Falsch");

}
private void beantworten_Load(object sender, EventArgs e)
{

string line = sr.ReadLine();
string[] parts = line.Split('#');
devokabel.Items.Add(parts[0]);


}

ist das so richtig? danke für eure Hilfe!
 
Mit dem Vergleichsoperator == vergleichst du nur Referenzen und nicht den eigentlichen Text. Der Text selbst wird mit der Funktion Equals verglichen.

Mal ein Beispiel:

PHP:
string s1 = "Test";
string s2 = "Test";
string s3 = new string("Test");

//s1 und s2 zeigen auf das selbe Objekt, da in C# keine Veränderung an Strings möglich ist.
//Deshalb gilt:

if(s1 == s2) // true
if(s1.Equals(s2)) //logischerweie auch true
if(s1 == s3) //false, du du mit new eine neues Objekt erzeugst hast
if(s1.Equals(s3) //true, da nur der Text verglichen Wert

Du kannst also ruhig if(textbox.Text==text2) verwenden, das klappt

wie meinst du das mit "keine Veränderungen an Strings möglich"? wenn ich sage
PHP:
text1 += "bla";
wird dann ein neues Objekt erzeugt? oder wie meinst du das?
 
string s3 = new string("Test");
das geht in C# nicht.

Stimmt, hab das auf die schnelle aus dem Kopf gemacht. Dazu muss man die Klasse StringBuilder verwenden.

wie meinst du das mit "keine Veränderungen an Strings möglich"? wenn ich sage
PHP:
text1 += "bla";
wird dann ein neues Objekt erzeugt? oder wie meinst du das?

Genau, jede Veränderung eines Strings erzeugt ein neues Objekt.
 
Code:
private void check_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string line = sr.ReadLine();
string[] parts = line.Split('#');
string english = (parts[1]);
if (evokabel.Text == english)
{
MessageBox.Show("Richtig");
// an dieser Stelle dann diese Zahl erhhen, indem datei neu beschrieben wird}
else MessageBox.Show("Falsch");

}

private void beantworten_Load(object sender, EventArgs e)
{

string line = sr.ReadLine();
string[] parts = line.Split('#');
devokabel.Items.Add(parts[0]);


}

ist das so richtig? danke für eure Hilfe!

hat jemand eine antwort? danke ;)


Außerdem habe ich noch eine Frage:
Seit gestern erscheint beim ausführen des Programms ein Fehler,
bei dem ich zwar auf weiter klicken kann und es dann perfekt läuft, trotzdem
würde ich den Fehler gerne beheben. Wie kann ich das machen?

"Der Index war außerhalb des Arraybereichs."
 
Zuletzt bearbeitet:
PHP:
private void check_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string line = sr.ReadLine();
string[] parts = line.Split('#');
string english = (parts[1]);
if (evokabel.Text == english)
{
MessageBox.Show("Richtig");
// an dieser Stelle dann diese Zahl erhhen, indem datei neu beschrieben wird}
else MessageBox.Show("Falsch");

}
private void beantworten_Load(object sender, EventArgs e)
{

string line = sr.ReadLine();
string[] parts = line.Split('#');
devokabel.Items.Add(parts[0]);


}

ist das so richtig? danke für eure Hilfe!

typischerweise liest .ReadLine() eine Zeile aus und springt dann zur nächsten, du müsstest also bei beantworten_Load() einmal die Zeile auslesen und alle Werte in Variablen speichern
also außerhalb der Methoden die Vaiablen definieren und von beantworten_Load() aus die Werte dort speichern und in check_LinkClicked() wieer aufrufen
PHP:
private void check_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
{ 
string english = this.parts[1];
if (evokabel.Text == english)
{ 
MessageBox.Show("Richtig"); 
// an dieser Stelle dann diese Zahl erhhen, indem datei neu beschrieben wird} 
else MessageBox.Show("Falsch"); 
} 

private string[] parts;

private void beantworten_Load(object sender, EventArgs e) 
{ 
string line = sr.ReadLine(); 
this.parts = line.Split('#');
 
devokabel.Items.Add(this.parts[0]); 
}

um dieses "Der Index war außerhalb des Arraybereichs." zu verhindern, kannst du den Wortvergleich an eine Abfarge binden, die prüft wie groß dein Array ist
PHP:
private void check_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
{ 
  if(this.parts.length>=2)
  {
    string english = this.parts[1];
    if (evokabel.Text == english)
    {
      MessageBox.Show("Richtig"); 
      // an dieser Stelle dann diese Zahl erhhen, indem datei neu beschrieben wird}
      else MessageBox.Show("Falsch"); 
    }
  }
}
 
Danke für die Hilfe, habe es nun hinbekommen.. nun möchte ich aber bei ner richtigen antwort parts[2] hochzählen um 1. Aber nur bei dem jeweiligen Zeile..
so das alle richtig beantwortete Fragen hinterher eine 1 am ende haben..

zum beispiel:
text1#text2#1

wie realisiere ich das am besten? ;)