myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Wie kann ich im UserDataGridView programmatisch den Focus setzen? (erledigt)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
ChrisProg ChrisProg ist männlich
myCSharp.de-Mitglied

avatar-3533.jpg


Dabei seit: 27.01.2009
Beiträge: 157
Entwicklungsumgebung: VS 2017 C#


ChrisProg ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
        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

C#-Code:
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 06.01.2021 09:59.

20.12.2020 22:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
colophonius
myCSharp.de-Mitglied

Dabei seit: 10.05.2011
Beiträge: 3


colophonius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
05.01.2021 11:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ChrisProg ChrisProg ist männlich
myCSharp.de-Mitglied

avatar-3533.jpg


Dabei seit: 27.01.2009
Beiträge: 157
Entwicklungsumgebung: VS 2017 C#

Themenstarter Thema begonnen von ChrisProg

ChrisProg ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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



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

Aber: mit einem Invoke (mit Delay) funktioniert es dann ...

In Code gepackt sieht es dann so aus :

C#-Code:
        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
06.01.2021 09:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
colophonius
myCSharp.de-Mitglied

Dabei seit: 10.05.2011
Beiträge: 3


colophonius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 11.01.2021 15:11.

11.01.2021 09:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.01.2021 15:55