Laden...

[gelöst] Fokus-Kontrolle für Textboxen: Ermitteln, welches Control vorher den Focus hatte

Erstellt von bernardo vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.553 Views
B
bernardo Themenstarter:in
39 Beiträge seit 2011
vor 11 Jahren
[gelöst] Fokus-Kontrolle für Textboxen: Ermitteln, welches Control vorher den Focus hatte

Kann man in der Ereignismethode textBox_Enter erfahren, welche vorherige TextBox
(oder ein anderes control) den Fokus hatte oder muss man das selbst nachverfolgen?

C
2.121 Beiträge seit 2010
vor 11 Jahren

Nachdem du da keinen Parameter mit dem letzten Control hast, musst du dir das selber merken.
Du kannst ja allen Controls im Formular per Suche ein Event verpassen (Enter), mit dem du den Fokus nachvollziehbar machst.

B
bernardo Themenstarter:in
39 Beiträge seit 2011
vor 11 Jahren

Genauso hatte ich es bereits gemacht. War auf der Suche nach etwas bequemeren ohne viel Schreibaufwand. Danke!

T
708 Beiträge seit 2008
vor 11 Jahren

Guten Morgen,

ja es geht auch mit etwas weniger Aufwand:

Man läuft automatisch alle Controls durch und fügt den Focus-Listener hinzu und wertet diesen aus:


         private void AddGotFocusListener(Control ctrl)
        {
            foreach (Control c in ctrl.Controls)
            {
                c.GotFocus += new EventHandler(Control_GotFocus);
                if (c.Controls.Count > 0)
                {
                    AddGotFocusListener(c);
                }
            }
        }
        
        private void Control_GotFocus(object obj, EventArgs e)
        {
            Control ctl = (Control)obj;
            Console.WriteLine("Focus: " + obj.ToString());
            Console.WriteLine("Control: " + ctl.Text);
            Console.WriteLine("Parent: " + ctl.Parent.Name);
            if(ctrl is Button || ctl.Visible == false)
            {
                Console.WriteLine("Nächstes Control aktivieren");
                ctl.SelectNextControl(this.ActiveControl, true, true, true, true);               
            }
        }

In diesem Fall wollte ich bestimmte Elemente/Button überspringen, die "zugeklappt" sind.
Für Deinen Fall, kannst du dann in der Konsole den Verlauf nachvollziehen oder das Ganze in einer Liste o.ä. speichern.

[EDIT] Auf anraten von herbivore den Code etwas Angepasst.
Überprüfung von typeof durch is ersetzt.

B
bernardo Themenstarter:in
39 Beiträge seit 2011
vor 11 Jahren

Hallo trib

Erscheint mir immer noch zu kompliziert. Kommt man in C# noch an die Windows-Nachrichten WM_xxxx heran, in denen das leicht auslesbar drinsteht oder hat .NET diese Nachrichten ganz abgeschafft? Es ist zwar mühsam, mit WinApi zu arbeiten doch man kommt jederzeit an die Tiefen des Systemablaufes heran.

5.658 Beiträge seit 2006
vor 11 Jahren

Hi bernardo,

was ist daran einfacher? Es gibt auch das LostFocus-Ereignis, damit kannst du erkennen, welche Textbox zuletzt den Focus verloren hat.

Christian

Weeks of programming can save you hours of planning

S
269 Beiträge seit 2010
vor 11 Jahren

Kommt man in C# noch an die Windows-Nachrichten WM_xxxx heran,(...)

Ja!

Der Vollständigkeit halber:
Controls, und damit auch Forms, haben eine überschreibbare Methode namens WndProc(ref Message m)
Auf folgender Seite finden sich verschiedenste Nachrichten und deren Codes: pinvoke.net: WindowsMessages (Enums)

B
bernardo Themenstarter:in
39 Beiträge seit 2011
vor 11 Jahren

Danke für die hilfreichen Hinweise. Alles gut zu wissen. Habe den Focus jetzt im Griff.
Super Community! 🙁

F
10.010 Beiträge seit 2004
vor 11 Jahren

Da Du von WindowProc und Co redest, könnte es sein das Du mit viel Aufwand etwas nachbauen willst, was man in .NET komplett anders löst?

Was willst Du so lösen?
Manchmal ( eher meistens ) gibt es in .NET bessere Wege als auf OS Level zu gehen.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo FZelle,

wie man die Ermittlung des letzten Controls, das vorher den Focus hatte, mit .NET Mitteln durchführt, steht weiter oben. Diesen Weg hat - obwohl es meiner Ansicht nach kaum besser geht - bernardo als zu kompliziert empfunden und daher gefragt, ob man auch direkt an die Windows-Nachrichten kommt, um die Aufgabe damit möglicherweise einfacher zu lösen. Dass es damit (vermutlich) nicht einfacher gehen wird, wird er dann schon von alleine feststellen. 😃 Und falls doch, dann hätte eine solche Lösung durchaus ihre Berechtigung.

Den Hinweis, dass man die WndProc nicht benutzen sollte, wenn man es mit .NET mitteln genauso gut oder besser hinbekommt, ist natürlich grundsätzlich sinnvoll und soll auch so stehen bleiben. Weiter diskutieren müssen wir das und das eigentliche Thema wohl aber nicht mehr.

herbivore

F
10.010 Beiträge seit 2004
vor 11 Jahren

Sehe ich erfahrungsgemäß anders.

Für mich sieht es so aus als wenn er von einem anderem System kommt und in .NET genau das machen will was er vorher gemacht hat.
Und das muss in .NET nicht unbedingt so nötig sein.

Z.B. DataBinding mit INotifyPropertyChanged und IDataErrorInfo kann genau das sein was er eigentlich machen wollte ( alte Textbox validieren und ggf zurückspringen) , ohne es zu wissen.

Aber das wissen wir erst wenn er es uns sagt.