Hallo zusammen,
ich habe folgendes Problem:
Ich habe 3 Klassen -
Die Suche funktioniert ohne Probleme - ich möchte jedoch mit der Klasse Mitteilung die Suche jederzeit abbrechen können, falls dem User die Suche zu lange dauert.
Die Klasse Form1 ruft zuerst die Klasse Mittelung in einem eigenen Thread auf und führt dann die Suche durch
MitteilungBox mitteilungBox = new MitteilungBox();
mitteilungBox.FormClosing += new FormClosingEventHandler(mitteilungBox_FormClosing);
ThreadStart starter = null;
starter = delegate { mitteilungBox.ShowDialog(); };
thread = new Thread(starter);
thread.Start();
search = new Search(dataGridViewTable);
search.Find(comboBoxSearchFor.SelectedItem.ToString(), textBoxSearchtext.Text);
Wie teile ich jedoch nun meiner aktiven Suche mit, dass in dem Fenster der Klasse Mitteilung der "Abbrechen" Button gedrückt wurde?
Hier ein Ausschnitt der Suchklasse:
for (int i = startIndex; i < dgv.Rows.Count; i++)
{
if (AbortSearch)
{
AbortSearch = false;
dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
break;
}
DataGridViewRow row = dgv.Rows[i];
string val = row.Cells[column].Value as string;
if (val.Contains(key))
{
dgv.ClearSelection(); row.Selected = true;
dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
return;
}
}
Ich stehe momentan ein wenig aufm Schlauch - ich hoffe ich konnte es einigermaßen verständlich machen was ich will 😃
Wäre super wenn man mir helfen könnte - im Voraus vielen Dank!
MfG
i06001
Du könntest ein Event implementieren welches die Abbrechen Klasse feuert und die Klasse die den Thread startet abonniert. Nach dem feuern einfach das interne Flag auf true setzen, und die Thread bricht ab indem er seine Ihm zugeteilte Methode verlässt.
Again what learned...
HAllo,
du solltest das etwas anders lösen:
Ich halte es für besser, wenn die eigentliche Aufgabe in einen seperaten Thread kommt, und NICHT das öffnen eines Dialoges.
Starte in Form1 deine Suche in einem eigenen Thread und öffne aus Form1 heraus danach den Dialog.
Wenn Abbrechen geklickt wurde, wurde dies per Event an Form1 mitgeteilt, welches eine Abbruchvariable auf true setzt.
Der Thread, welcher die Suche ausführt, sollte diese VAriable prüfen, und ggf abbrechen.
Noch besser wäre es wohl, einfach den BackgroundWorker zu verwenden.
Wenn du .net 4 verwendest, kannst du die Suche in einem Task starten lassen, und von Form1 aus eine CancellationToken setzen.
mfg
serial
Hallo,
vielen Dank für eure Antworten!
Also mit dem BackgroundWorker funktioniert es super.
Habe mich bis jetzt immer von dem BackgroundWorker ferngehalten - wie ich bemerke vollkommen grundlos....
Na ja, komme vom Land - und was der Bauer nicht kennt .... 😃
MfG
i06001