Laden...

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

Erstellt von ChrisProg vor 3 Jahren Letzter Beitrag vor 3 Jahren 592 Views
ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 3 Jahren
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

9 Beiträge seit 2011
vor 3 Jahren

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

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 3 Jahren

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

9 Beiträge seit 2011
vor 3 Jahren

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.