ich versuche verzweifelt den Focus auf ein Datagridview oder Button zu
setzen, aber er bleibt immer auf dem 1. Textfeld (niedrigste
Aktivierungsreihenfolge) h�ngen.
Was ist die Ursache, bzw. wie kann ich ein anderes Control aktivieren /
fokusieren?
Coding:
// --- Focus
this.tabGesellschaft.SelectedTab = this.tpgTarife; // TabPage
selektieren
//this.adgvTarife.Focus(); // funktioniert nicht
this.btnClose.Focus(); // funktioniert nicht
Besten Dank vorab!
Ciao, Alberto
Am Sat, 6 Mar 2010 18:01:50 +0100 schrieb Alberto Luca:
> ich versuche verzweifelt den Focus auf ein Datagridview oder Button zu
> setzen, aber er bleibt immer auf dem 1. Textfeld (niedrigste
> Aktivierungsreihenfolge) h�ngen.
Vielleicht schl�gt eine Validierung fehl (�berpr�f mal das
Validating-Ereignis)? Oder OnExit-Ereignishandler verhindert dass der Focus
das erste Textfeld verl��t? - Ohne mehr von Deinem Code zu sehen, ist es
wirklich nur ein R�tselraten. Es k�nnte so vieles sein.
Gruss
Marcel
Kann es sein, da� Du diesen Code ausf�hrst, w�hrend das Formular noch
nicht sichtbar ist? In diesem Fall k�nntest Du 'Select' anstelle von
'Focus' aufrufen, da 'Focus' in dieser Situation nicht funktioniert.
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>
> ich versuche verzweifelt den Focus auf ein Datagridview oder Button zu
> setzen, aber er bleibt immer auf dem 1. Textfeld (niedrigste
> Aktivierungsreihenfolge) h�ngen.
Typischerweise versucht man ja im Form_Load diesen
Button-Focus zu setzen, wo es eigentlich nicht hingeh�rt,
da die Form ja noch nicht angezeigt wird. Pragmatisch kannst
Du dann zum Beispiel folgendes machen:
this.Show(); btn.Focus();
oder:
btn.Select();
oder:
protected override void OnShown(EventArgs e)
{
base.OnShown(e); btn.Focus();
}
je nachdem, welche Effekte gew�nscht sind,
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
besten Dank f�r eure Hinweise.
Mit "Select" hats funktioniert, da im Load-Ereignis abgesetzt.
Bedeutet das, dass ich statt Focus immer Select (auch nach kompletter
Anzeige des Controls) verwenden kann, bzw. wann ist dann Focus sinnvoll?
Ciao, Alberto
> besten Dank f�r eure Hinweise.
> Mit "Select" hats funktioniert, da im Load-Ereignis abgesetzt.
ja, dann lag ich ja mit meiner Vermutung richtig.
> Bedeutet das, dass ich statt Focus immer Select (auch nach kompletter
> Anzeige des Controls) verwenden kann, bzw. wann ist dann Focus sinnvoll?
"Focus ist eine Methode auf niedriger Ebene, die haupts�chlich f�r Autoren
benutzerdefinierter Steuerelemente bestimmt ist. Anwendungsprogrammierer
sollten hingegen die Select-Methode oder die ActiveControl-Eigenschaft f�r
untergeordnete Steuerelemente bzw. die Activate-Methode f�r Formulare
verwenden."
[Control.Focus-Methode (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.focus.aspx
"Ein Steuerelement kann ausgew�hlt werden und den Eingabefokus erhalten,
wenn s�mtliche folgenden Bedingungen wahr sind:
- der Selectable-Wert von ControlStyles ist auf true festgelegt,
- das Steuerelement ist in einem anderen Steuerelement enthalten,
- und alle �bergeordneten Steuerelemente sind sowohl *sichtbar* als auch
aktiviert. "
Die Select-Methode aktiviert ja das Control.
Am Sat, 06 Mar 2010 21:12:31 +0100 schrieb Herfried K. Wagner [MVP]:
> Kann es sein, da� Du diesen Code ausf�hrst, w�hrend das Formular noch
> nicht sichtbar ist? In diesem Fall k�nntest Du 'Select' anstelle von
> 'Focus' aufrufen, da 'Focus' in dieser Situation nicht funktioniert.
Du hast Recht! Ich habe nie so richtig verstanden, warum Focus in diesem
Szenario nicht funktionieren soll (schlie�lich hat der Button ja bereits
ein Handle), deshalb hab ich mir das Ganze jetzt etwas n�her angesehen.
Normalerweise kann man ja �ber Control.CanFocus �berpr�fen, ob ein Control
den Focus �berhaupt erhalten kann. Dabei wird soviel ich wei� dreierlei
�perpr�ft: Ob mit dem Control ein Fensterhandle assoziiert ist, und falls
ja, ob es sichtbar *und* aktiv ist. Diese �berpr�fung findet intern bei
jedem Aufruf von Control.Focus() statt. Ist ein Control nicht fokusierbar,
wird es nicht fokusiert. Im Form.OnLoad-Handler ist das Control noch nicht
sichtbar, also wird es auch nicht fokusiert. Soweit so gut. Aber der
folgende Code funktioniert sehr wohl in Form_Load:
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetFocus(HandleRef hWnd);
private void Form1_Load(object sender, EventArgs e) {
IntPtr prevWindowHandle = SetFocus(new HandleRef(this.buttonClose,
this.buttonClose.Handle));
}
Der Keyboard-Fokus wird auf die entsprechende Schaltfl�che verschoben, und
wir erhalten auch ein g�ltiges Handle als R�ckgabewert. Eine direkte
�berpr�fung, ob das Fenster aktiv ist (vor dem Aufruf von SetFocus) ergibt,
dass das mit buttonClose assoziierte Fenster aktiv ist (obwohl unsichtbar).
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool IsWindowEnabled(HandleRef hWnd);
bool enabled = IsWindowEnabled(new HandleRef(this.buttonClose,
this.buttonClose.Handle))
Das hei�t aber nicht, dass das Fenster im .NET-Sinn aktiviert ist, sondern
nur dass das Fenster bereits Tastaturbefehle erhalten kann (auch wenn es
unsichtbar ist).
Ich habe mal zum Testen ein paar Ereignisse abonniert und darin einige
Debug.Prints eingef�gt, um herauszufinden, was beim Aufruf von SetFocus()
wirklich passiert. Das kam dabei heraus:
Form1 constructor: Before InitializeComponent()
buttonClose_VisibleChanged: buttonClose.Visible==False
Form1 constructor: After InitializeComponent()
Form1_Load: Before SetFocus()
SetFocus()
buttonClose_Enter
Form1_Load: After SetFocus()
buttonClose_VisibleChanged: buttonClose.Visible==True
Direkt nach dem Erstellen von buttonClose in InitializeComponent() ist
buttonClose.Visible==true. Erst nach dem Aufruf von
this.Controls.Add(this.button1) wird Visible auf false gesetzt (da die Form
unsichtbar ist). Sobald die Form sichtbar wird, �ndert sich auch die
Sichtbarkeit des Buttons wieder. Aber inzwischen (nach Aufruf von
SetFocus()) wird der Handler buttonClose_Enter ausgef�hrt, *obwohl das
Fenster nicht sichtbar ist*.
Ich glaube dass es eben solche Dinge sind, die die .NET-Entwickler dazu
bewogen haben, vor dem Fokusieren die Sichtbarkeit des Controls zu
�berpr�fen. Das Fokusieren an sich ist nicht das Problem, das w�re wie oben
gesehen in Form_Load durchaus machbar, aber das w�rde u.U. (ungeplante)
Seiteneffekte verursachen, die nicht zuletzt sicherheitsrelevant sein
k�nnten.
Gruss
Marcel