Laden...

Wie kann ich im UserDataGridView programmatisch den Focus setzen? (erledigt)

Letzter Beitrag vor 4 Jahren 4 Posts 712 Views
Wie kann ich im UserDataGridView programmatisch den Focus setzen? (erledigt)

Hallo,

irgendwie stehe ich auf dem Schlauch...

Folgender Aufbau:

  • TabControl mit mehrerern Reitern
  • in einem Reiter befinden sich zwei ineinander verschachtelte SplitContainer
  • in dem inneren SplitContainer ist ein (User)DataGridView

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

  • Panel
  • GroupBox
  • PictureBox
  • ProgressBar
  • Splitter
  • Label
  • LinkLabel
    sind, nicht per Focus() oder Select() den Fokus erhalten können ...

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.