Laden...

[erledigt] Vergleich funktioniert nur bei sichtbarer TextBox

Erstellt von Gumba vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.541 Views
G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren
[erledigt] Vergleich funktioniert nur bei sichtbarer TextBox

hey,

ich konnte keine lösung für mein problem finden, auch nicht mit der suchfrunktion (vll die falschen keywords?), also hab ich mich entschlossen einen neuen thread aufzumachen um mein problem zu schildern:

In meiner Anwendung muss ich den Anfang von einem String mit einem Item aus einer comboBox vergleichen. Der String steht in einer Textbox. Für den Vergleich hab ich

if (textBox1.Text.StartsWith(comboBox1.Items[0].ToString()))

Das Problem ist folgendes:
Wenn die textBox sichtbar ist funktioniert das if optimal, aber wenn die textbox unsichtbar ist funktioniert der code komischerweise nicht mehr. Warum nicht?
Ich habe das Vergleichen auch noch mit einem normalen String sowie einer textbox (unsichtbar/sichtbar) die zur laufzeit erstellt wurde getestet - es funktioniert keins von den dreien.
Meine Frage also: Warum funktioniert StartWith bei einer SICHTBAREN textbox bei einer UNISCHTBAREN und einem String aber nicht?

Um noch ein paar Infos da zu lassen: Der Vergleich wird in einem neben-thread ausgeführt. Mit dem Thread gibt es jedoch soweit keine Probleme.
Also falls ihr Lösungen für mein Problem wisst würd ich mir über Antworten freuen.
Am besten wenn es Lösungen mit normalen String sind, da ich die Textbox löschen möchste. Sollte es jedoch nur über die Textbox funktionieren wäre das auch kein Problem.

Mfg
Gumba

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Gumba,

das sollte so eigentlich schon funktionieren.
Vermutlich ist der Text in der Textbox noch nicht gesetzt wenn der Code ausgeührt wird.
Hast du schon versucht durch den code zu debuggen um zu sehen ob alle werte gesetzt sind wie sie das sein sollten?

Beim Arbeiten mit mehreren Threads gilt es immer zu beachten dass man nicht vom WOrker-Thread aus auf die GUI zugreift.
Dadurch kann es zu hässlichen Nebenwirkungen kommen ^^
Guck mal hier: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Versuche einfach durch den Code zu debuggen dann siehst du schon ob alle werte stimmen.

Gruss
michael

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

danke für die schnelle antwort
nur leider bin ich mir zu 100% sicher, dass die werte gesetzt sind, da in dem thread ZUERST die werte alle gesetzt sind und erst wenn sicher gestellt ist, dass alle vorhanden sind wird verglichen. Es wird auch nicht vom worker thread darauf zugegriffen, es läuft alles seperat in diesem thread ab. es wird nicht mal was ausgegeben, was vll im konflikt mit dem hauptthread stehen könnte. es wird nur eine varibale gesetzt, die wiederrum nur in diesem thread für weitere aktionen genutzt werden soll.

Das kuriose ist ja, das wenn beim ablauf die textbox sichtbar ist es funktioniert. Wenn beim SELBEN ablauf jedoch die textbox unsichtbar ist funktioniert es nicht mehr?? Also irgendwie glaub ich da is was faul 😉

Mfg

3.430 Beiträge seit 2007
vor 13 Jahren

Das kuriose ist ja, das wenn beim ablauf die textbox sichtbar ist es funktioniert. Wenn beim SELBEN ablauf jedoch die textbox unsichtbar ist funktioniert es nicht mehr?? Also irgendwie glaub ich da is was faul 😉

Das klingt irgendwie unlogisch.. Mir fällt jetzt jedenfalls kein logischer Grund ein weshalb es nicht funktionieren sollte.

Versuch einfach durch den Code zu debuggen und stelle sicher was der Grund ist weshalb es nicht funktioniert, bzw. was nicht funktioniert.

Vielleicht schlägt diese IF-Abfrage aus einem anderen Grund fehl.

Gruss
Michael

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

das wird bei mir schwierig...
Der thread soll sich um den empfang von strings kümmern und ich zunächst auf einen server connecten und ich dann von einer zweiten anwendung einen string schicken müsste. Ich habe jedoch um die werte, die im if überprüft werden sollen vorher noch zu überprüfen eine messagebox vor das if gesetzt.

MessageBox.Show(textBox1.Text + " - " + comboBox1.Items[0].ToString())

Diese gibt z.B. folgendes aus (textboxinhalt zuerst comboboxinhalt folgend):

Name: Wie geht es dir? - Name

In diesem Fall steht Name für den benutzer von anwendung 2 der den string geschickt hat. Der name wird bei jeder nachricht automatisch davorgesetzt (mit : und " ") nun soll er halt die anfang von Name: Wie geht es dir? mit Item[0] vergleichen. Und da wir ja gesehen haben, dass Name durchaus der Anfang des Strings ist und wir wissen, dass StartWith soweit vergleicht, wie werte da sind (also die länge von Name) müsste normalerweise die überprüfung true ergeben, was sie jedoch nicht tut...

Mfg

EDIT.: Rechtschreibfehler 😉
EDIT2.: Ich merke grade, dass es jetzt auch mit sichtbarer textBox nicht mehr funktioniert. Ich werde noch mal alles überprüfen und mich dann erneut hier melden 😉
EDIT3.: Ok falscher Alarm -.- mit sichtbarer textbox funktioniert es doch noch (hatte alten buildstand genommen) das problem besteht also weiterhin noch

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Gumba,

da in dem thread ZUERST die werte alle gesetzt sind und erst wenn sicher gestellt ist, dass alle vorhanden sind wird verglichen. Es wird auch nicht vom worker thread darauf zugegriffen, es läuft alles seperat in diesem thread ab. es wird nicht mal was ausgegeben, was vll im konflikt mit dem hauptthread stehen könnte.

das ist mir ehrlich gesagt viel zu konfus beschrieben. Ich kann daraus nicht lesen, was genau in welchem Thread läuft. Ich kann nicht mal sagen, von wievielen verschiedenen Threads die Rede ist.

Beachten musst du auf jeden Fall: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

es wird nur eine varibale gesetzt, die wiederrum nur in diesem thread für weitere aktionen genutzt werden soll.

Ist die Variable volatile? Sonst kann es sein, dass sie zwar in einem einen Thread richtig gesetzt wird, aber der andere Thread nichts davon mitbekommt.

herbivore

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

dann will ich versuchen es etwas genauer darzustellen 😉
es gibt 2 threads: 1x den hauptthread (den man immer hat) und 1x einen zusätzlichen thread.
Dieser zusätzliche thread wird zu beginn gestartet und hat dann nichts mehr mit dem hauptthread zu tun (es wird 1x ein treenode gesetzt doch das wurde mit treeNode.BeginnInvoke erfolgreich ausgelagert). Desweiteren soll dieser thread einen in diesem thread erstellten string mit einem item aus einer combobox vergleichen, welche im hauptthread erstellt wurde. Diese combobox wird jedoch nicht aktualisiert, noch wird etwas gesetzt. Es wird lediglich das Item abgefragt (Könnte hier vll der Konflikt liegen?).

Mfg
Gumba

D
216 Beiträge seit 2009
vor 13 Jahren

Und wenn du bei SelectedIndexChanged von der Combobox das ausgewählte item in eine Variable schreibst und immer mit der Variable vergleichst?

Darth Maim

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

es geht ja leider nicht um das ausgewählte item 😉
ich poste einfach mal die schleife in der der vergleich drin steht:


for (j = 0; j < comboBox1.Items.Count; j++)
{
   MessageBox.Show(textBox1.Text + " " + comboBox1.Items[j].ToString());
   if (textBox1.Text.StartsWith(comboBox1.Items[j].ToString()))
   {
      label4.Text = comboBox1.Items[j].ToString();
      kontakt = comboBox1.Items[j].ToString();
      break;
   }
}

sobald der vergleich true ist, wird kontakt auf das ensprechende item gesetzt und später wird der text dann zu dem entsprechenden kontakt zugeordnet. Der Grundausgang ist, dass es verschiedene Kontakte geben soll und der empfangene text zu den Kontakten (je nachdem wer geschickt hat) zugeordnet wird.

Mfg

EDIT.: Das komische ist: Bevor der Anfang des Strings verglichen wird wird zunächst das Ende verglichen, um die Art des Textes zu definieren (neuer Kontakt oder einfache Nachricht). Die Überprüfung mit EndsWith funktioniert aber tadellos sowohl mit sichtbarer als auch unsichtbarer textbox...

D
216 Beiträge seit 2009
vor 13 Jahren

Das ist doch jetzt Code, der in einem 2. Thread ausgeführt wird, oder? Dann knallts vielleich da:

label4.Text = comboBox1.Items[j].ToString();

Sollte aber eigentlich eine Fehlermeldung geben und nicht von der Sichtbarkeit irgendeiner Textbox abhängen...

Kommt das Programm überhaupt in die Schleife oder ins if - setz mal BreakPoints und guck dir genau an was da passiert. Vielleicht hat die Combobox wenn sie nicht angezeigt wird keine Items - dann würde er nicht in die Schleife gehen => BreakPoint und alle Variablen mal überprüfen.

Darth Maim

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

ich hab nen breakingpoint auf die if abgrafe gesetzt und die werte verglichen. alle variablen und werte sind so wie sie sein sollen.
an dem label4 hat es anscheinend nicht gelegen, denn das hab ich eben rausgenommen und durch eine Messagebix ersetzt, die hallo ausgeben soll, falls die if-abfrage erfolgreich ist. Leider hat es wieder einmal nich geklappt... 😦

EDIT.: Also leute es scheint irgendetwas mit der comboBox nicht zu stimmen, denn einen normlane string kann ich vergleichen. Ich mach mich dann mal auf die suche nach dem fehler und melde mich wenn ich ihn gefunden hab 😉

Mfg

EDIT2.: Also das ganze ist sehr mysteriös! Bei der sichtbaren textBox steht in den comboBox-Items Name
Bei der textbox erstellt zur runtime steht in den comboBox-Items Name\0inf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

warum????
Wobei man, wenn man in die comboBox schaut nur Name auffindet. die ganzen \0 sind dann verschwunden, aber ich denke genau hier drückt der schuh! Hat vll jemand ne idee warum das auftritt?

916 Beiträge seit 2008
vor 13 Jahren

Hallo Gumba,

dein Problem wurde doch bereits beschrieben. Hast du dir den entsprechenden Thread mal durch gelesen? [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Du greifst aus einem Thread auf dein Control zu, welches das Control nicht erzeugt hat. Das darfst du weder lesend noch schreibend machen! Deshalb hat der herbivore auch den Hinweis gegeben, den du jedoch m.E. ignoriert hast!

Again what learned...

G
Gumba Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

ok anscheinend klappt jetzt alles und es hat wirklich daran gelegen, dass ich die combobox im falschen thread gelesen hab 😦
wollte mich noch mal bei allen hier bedanken
bis zumnächsten problem 😉

Mfg
Gumba