Hallo,
irgendwie stehe ich auf dem Schlauch...
Folgender Aufbau:
die SplitContainer sind auf TabStop = false gesetzt, das DataGridView auf TabStop = true...
folgendes Ereignis habe ich abonniert:
private void Pageframe_SelectedIndexChanged(object sender, EventArgs e)
{
if (!start && ((TabControl)sender).SelectedTab.Name.Trim() == "tabPage_positionen")
{
int x_current_row = userDGV_positionen.CurrentCell.RowIndex;
userDGV_positionen.CurrentCell = userDGV_positionen["artikel_nr", x_current_row];
ActiveControl = userDGV_positionen;
ActiveControl.SelectNextControl(ActiveControl, true, true, true, true);
}
}
Was ich auch probiere ActiveControl ist und bleibt immer der oberste SplitContainer ...
Führe ich
ActiveControl.SelectNextControl(ActiveControl, true, true, true, true);
im Direktfenster aus, erhalte ich immer false zurück
Weiß jemand Rat ?
MfG Christian
Hallo Christian,
das Problem hierbei ist, dass ein Formular keine einfache Liste aller Controls hat. Die Auflistung Form.Controls liefert genau ein Control, nämlich das TabControl.
Du kannst also ActiveControl nicht dein DataGridView zuweisen, weil es nicht Mitglied der Controlsauflistung des TabControl ist.
Die Controls eines Formulars sind verschachtelt. Das DGV ist Mitglied der Controls vom inneren SplitContainer.
In splitContainerInnen.Controls[1].Controls findest du dein DGV.
Viele Grüße
Ralph
Hallo Ralph,
danke für deine Erklärung, aber:
SelectNextControl soll doch das nächste Control in der Tab-Reihenfolge aktivieren ...
Und wenn ich das ganze mit der Tab-Taste durchspiele, dann funktioniert es ja wie gedacht ... 🤔
Mittlerweile habe ich aber das Problem lokalisieren und lösen können:
Das Grundproblem ist das gem. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.canselect?view=netcore-3.1
Controls die Children von
Da der SplitContainer Panel enthält ... 😜
Aber: mit einem Invoke (mit Delay) funktioniert es dann ...
In Code gepackt sieht es dann so aus :
public void ControlSetFocus(Control x_control)
{
if (x_control.CanSelect)
{ x_control.Select(); }
else
{
// lt. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.canselect?view=netcore-3.1
// können Controls die Childen von
// - Panel
// - GroupBox
// - PictureBox
// - ProgressBar
// - Splitter
// - Label
// - LinkLabel
// sind, nicht per Focus() oder Select() den Fokus bekommen, Invoke (mit dem Delay!) geht aber ...
System.Threading.Tasks.Task.Delay(100).ContinueWith(_ =>
{
Invoke(new Action(() => { x_control.Select(); }));
});
}
}
MfG Christian
Das Grundproblem ist das gem.
>
Controls die Children von
- Panel
- GroupBox
- PictureBox
- ProgressBar
- Splitter
- Label
- LinkLabel
sind, nicht per Focus() oder Select() den Fokus erhalten können ...
Das interpretiere ich anders: Controls, die von den benannten **abgeleitet **werden, können keinen Focus erhalten.
Aber schön, dass du eine Lösung gefunden hast.