Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich im UserDataGridView programmatisch den Focus setzen? (erledigt)
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 174
Herkunft: Cloppenburg

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ChrisProg am .
private Nachricht | Beiträge des Benutzers
colophonius
myCSharp.de - Member

Avatar #hTCOaca2pq20jHpL6ghN.jpg


Dabei seit:
Beiträge: 9
Herkunft: Magdeburg

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 174
Herkunft: Cloppenburg

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
colophonius
myCSharp.de - Member

Avatar #hTCOaca2pq20jHpL6ghN.jpg


Dabei seit:
Beiträge: 9
Herkunft: Magdeburg

beantworten | zitieren | melden

Zitat von ChrisProg

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 ...

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von colophonius am .
private Nachricht | Beiträge des Benutzers