Entwickler-Ecke

WinForms - Verschachtelte UserControls und das Leave-Ereignis


Beathoven - Fr 23.09.11 15:14
Titel: Verschachtelte UserControls und das Leave-Ereignis
Hallo zusammen,

so kurz vor dem Wochenende haut mich doch nochmal eine Sache um - und ich finde nicht mal eine Idee mein Problem zu umgehen.
Daher hoffe ich auf Eure Hilfe :)

Los gehts:

Ich habe eine einfache Form, ohne Panels oder dergleichen.
In diese Form setze ich einen Button - ohne Funktion.

Desweiteren habe ich ein UserControl - ohne irgendwelche Elemente (MeinUserControl1).

Und es gibt noch ein weiteres UserControl, dieses beinhaltet eine Combobox, die ich über die DataSource fülle: (MeinUserControl2)
Zitat:
public MeinUserControl2()
{
InitializeComponent();
List<String> abc = new List<string>();
abc.Add("A");
abc.Add("B");
abc.Add("C");
abc.Add("D");
comboBox1.DataSource = abc;
}

Außerdem habe ich noch eine Textbox eingebaut, ohne Funktion.

Jetzt gehts los:
Im Konstruktor der Form rufe ich eine neue Instanz eines MeinUserControl1-Objekts auf und füge sie den Controls hinzu:

Zitat:
public Form1()
{
InitializeComponent();
Controls.Add(new MeinUserControl1());
}



Im Konstruktor des MeinUserControl1-Objekts rufe ich eine neue Instanz eines MeinUserControl2-Objekts auf und füge sie den Controls hinzu:
Zitat:
public MeinUserControl1()
{
InitializeComponent();
Controls.Add(new MeinUserControl2());
}


Ich wünsche mir nun folgendes: wenn der ausgewählte Wert der Checkbox keinem Wert der Liste entspricht, so soll er eine Fehlermeldung ausgeben.
Somit lege ich folgenden Code auf das "Leave"-Ereignis meiner Combobox:
Zitat:
private void comboBox1_Leave(object sender, EventArgs e)
{
if (comboBox1.SelectedItem == null)
{
MessageBox.Show("NEE!");
this.comboBox1.Focus();
}
}


Das wars - so sollte es klappen.



Ich starte die Applikation und erhalte in etwa folgendes Bild :)

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
------------------------------------------------------------
# MeineForm                                                #
------------------------------------------------------------
# |comboBox *|      | Textbox_ |                           #
#                                                          #
#  __________                                              #
# |__Button__|                                             #
#                                                          #
#                                                          #
------------------------------------------------------------



Jetzt tippe einen falschen Wert in die Combobox ein, und klicke dann auf das Textfeld.
Sofort erscheint die Fehlermeldung, danach springt der Cursor/Focus wieder in die Combobox - super, denn genau das will ich.

Jetzt wiederhole ich den Vorgang, klicke aber diesesmal auf den Button.
Die Fehlermeldung erscheint, ich klicke auf okay und die Fehlermeldung erscheint wieder und wieder und wieder..

Kann mir jemand bitte helfen?

Danke und liebe Grüße
Beathoven


Ralf Jansen - Fr 23.09.11 15:29

Du solltest auf keinen Fall selbst am Focus rumspielen.
Zitat aus der Dokumentation
Zitat:
Do not attempt to set focus from within the Enter, GotFocus, Leave, LostFocus, Validating, or Validated event handlers. Doing so can cause your application or the operating system to stop responding.

Der Code gehört vermutlich eh besser in den Validating Event und nicht in Leave. Dort kannst du dann den Vorgang offiziell über die EventArgs canceln ohne den Focus zu ändern.


Beathoven - Fr 23.09.11 15:51

BÖSER BEATHOVEN ! *g*

Okay - nur um eines klarzustellen: das wusste ich nicht.
Ich hab extra nachgeguckt, was es zur Focus()-Methode zu sagen gibt, aber das steht nur:
Zitat:

Focus is a low-level method intended primarily for custom control authors. Instead, application programmers should use the Select method or the ActiveControl property for child controls, or the Activate method for forms.


Ich habs dann auch mal mit ActiveControl probiert - aber das Ergebnis ist das selbe.
Jetzt wo ich lese was Du schreibst, kann ich mir in etwa vorstellen was da schief läuft.
Wenn ich den Focus auf die Box setze wird automatisch ein GoTFocus Event ausgelösst, daran habe ich nicht gedacht, ist aber logisch.
Das hab ich zwar nicht definiert, aber irgendwo passiert ja immer irgendwas.

Sei es drum - jetzt muss ich das Problem nur noch lösen.
Ich hab es jetzt mal über die Validating-Methode probiert, und ein EventArgs gesetzt - es funktioniert!

Ich kann also nur noch eines machen: danke sagen!

DANKE DANKE DANKE :)

Daumen hoch und weiter so.
Liebe Grüße
Beathoven

PS: WOchenende gerettet.