Autor Beitrag
okrim
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Fr 24.01.14 22:40 
Hallo Ihr alle :D,

hab mal wieder ein Problem.
Möchte aus Form1 mit einem Button das Form2 öffnen, in Form2 hab ich ein tabControl wo ich gerne den 3ten Reiter als Ansicht möchte.

Das Form2 zu öffnen ist ja nicht das Problem, das mach ich wie folgt
ausblenden C#-Quelltext
1:
2:
     Einstellungen f = new Einstellungen(this);
     f.ShowDialog();

was ja auch funktioniert, hab auch bei Google Tipps gefunden wie man einen tap anspricht, aber in Verbindung mit dem öffnen des Form funktioniert es irgendwie nicht!

Freu mich über eure Hilfe
Vielen Dank im Voraus

Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 25.01.14 01:29 
Hallo,

schon versucht im Konstruktor von deinem Form2 auf das tabcontrol
ausblenden C#-Quelltext
1:
tabcontrol.SelectedTab = MeinZuSelektierendesTab;					

aufzurufen?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 25.01.14 11:29 
Konnte meinen Beitrag leider nicht editieren!

Du solltest folgendens versuchen ...

Im Konstruktor der Form2

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public Form2()
[
    InitializeComponent();
    this.tabControl1.SelectTab("tabPage3");
]


habs selbst getestet und funktioniert.

Hier noch der Link zur Klasse TabControl....

msdn.microsoft.com/d...s%28v=vs.110%29.aspx

MfG
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 25.01.14 21:38 
Danke erst mal für eure Antworten,

das würde so schon Funktionieren, hab nur vergessen zu sagen das ich das Form2 zweimal aus Form1 öffnen kann, einmal normal mit dem ersten tab und einmal mit dem dritten tab.
Ist das überhaupt möglich? Wenn nicht wäre es auch nicht so schlimm, dann öffne ich es halt immer normal :D

Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 25.01.14 22:19 
Möglich ist das schon aber dann darfst du nicht ShowDialog() aufrufen sondern die Show() Methode sonst wird es blockiert bis du das erste Form wieder schließt.

Ich kenne den Grund nicht warum du 2 mal die gleiche Form aufrufen möchtest aber du könntest in einer Variablen abspeichern ob die Form bereits einmal geööfnet ist und wenn ja dann eben das zweite Formular mit dem Reiter 3 öffnen. Das ganze prüfst du im Konstruktor von Form 2.

Ich hoffe das hilft dir weiter.

MfG

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet (überflüssige Zeilenumbrüche entfernt).
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: Sa 25.01.14 22:41 
Hallo Yankyy02,

ich erkläre erst mal was ich will, es geht um das Form_Einstellungen das mehrere Reiter hat, wenn ich es ganz normal öffne soll es auch mit dem ersten Reiter aufgehen.
Dann habe ich an einer anderen Stelle eine Abfrage nach einem Pfad und bei Einstellungen im Reiter drei eine Einstellung für den Pfad, wenn jetzt der Pfad nicht vorhanden ist dann kommt eine Warnung und wenn man auf OK geht, dann geht das Form_Einstellungen auf und da hätte ich gerne das es gleich mit Reiter drei öffnet, wo man den Pfad einstellen kann.
Also es soll nicht mehrmals zu öffnen sein.

Gruß Mirko
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Sa 25.01.14 23:17 
Ah ok! Es gibt sicher verschiedene Möglichkeiten das zu lösen (wie immer) Du könntest deiner Form2 also deinem Einstellungesformular
einen optionalen Parameter spendieren!

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public Form2(int a = 0)
{
    InitializeComponent();
    switch (a)
    {
        case 0:
           nix MACHEN
           break;
        case 1:
           in Reiter 3 springen
           break;
    }
}


Wo du dann in den Reiter 3 springen möchtest übergibst du dann eine 1 sollte nix übergeben werden passiert auch nichts.
Du könntest dann auch gleich eine bestimmte Textbox oder je nach dem was du auf Tab 3 hast hinspringen.

MfG
okrim Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82

Win 7
C# (VS 2010 Express)
BeitragVerfasst: So 26.01.14 00:18 
Super Danke,

jetzt hab ich es hin bekommen :D
Danke, danke, danke ...

Gruß Mirko
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 27.01.14 02:23 
Bitte kein int als boolischen Wert missbrauchen, dann doch gleich bool nehmen :/
Hier bietet sich ein Enum an, das dann für jeden Wert einen Tab repräsentiert und intern kannst du dann für den angegeben Wert den richtigen Tab auswählen.

Noch ein bisschen Gemecker:

Ein switch-Block sollte nur dann genutzt werden, wenn es wirklich das einzig sinnvolle ist und alle anderen Wege nur noch schlimmer sind.
Wenn es dann genutzt wird, dann sollte das in einer winzigen privaten Methode ganz tief vergraben werden, damit niemand es je wieder zu Gesicht bekommt.

In diesem speziellen Fall ist das - tut mir Leid für die Ausdrucksweise - ziemlicher Müll.
Abgesehen davon, dass int hier unpassend ist, reicht es ja auch, a einfach mit if auf 1 zu prüfen und dann in Reiter 3 zu springen.


Ich finde diesen Weg am besten:


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
public class Settings : Form
{
    // Das Enum in der Klasse, da es ausschließlich im Zusammenhang mit dieser Klasse Sinn macht
    // Ist das nicht so, sollten Enums außerhalb von Klassen angelegt werden
    public enum Tabs
    {
        SettingTab1,
        SettingTab2,
        SettingTab3
    }

    // Einfacher als jedes switch, da nur der Indexer vom Dictionary genutzt werden muss: tabNames[Tabs.SettingTab1]
    // Ob das jeder so sieht, weiß ich nicht, ich nutze Dictionaries aber sehr gerne als switch-Ersatz
    // readonly deshalb, weil ich irgendwo mal gehört hab, dass der Compiler dann besser Optimieren kann
    private readonly IDictionary<Tabs, string> _tabNames;

    public Settings()
    {
        InitializeComponent();

        tabNames = GetTabNames();
    }

    public Settings(Tabs firstSelectedTab)
        : this()
    {
        SwitchToTab(firstSelectedTab);
    }

    private IDictionary<Tabs, string> GetTabNames()
    {
        // Eine eigene Methode deshalb, da du die Tabs dann zentral in einer einzelnen Methode liegen hast
        // und der Konstruktor nicht damit voll gestopft wird.

        var result = new Dictionary<Tabs, string>();

        tabNames.Add(Tabs.SettingTab1, "SettingTab1"); // Namen müssen nur hier angepasst werden.
        tabNames.Add(Tabs.SettingTab2, "SettingTab2"); // Du kannst auch die Name-Property von jedem Tab direkt hier einsetzen
        tabNames.Add(Tabs.SettingTab3, "SettingTab3"); // Dann musst du den Namen nur dort oder im Designer ändern
        // Hier neue Tabs hinzufügen

        return result;
    }

    private void SwitchToTab(Tabs tab)
    {
        // Auch hier eine eigene Methode deshalb, da dann auch in der Klasse das Ändern des selektierten Tabs hierüber laufen kann

        var tabName = tabNames[tab];

        tabControl1.SelectTab(tabName);
    }
}
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Mo 27.01.14 12:36 
Hallo Palladin007,

sehr schöne Ausführung und kein Problem zwecks deiner Ausdrucksweise bin ja selber noch am lernen.

IDictionary hab ich noch nie verwendet und wurde auch in Büchern nicht wirklich behandelt. Was mich jedoch wundert
daß du mehr oder weniger sagst daß switch - case Konstrukte nur wenn überhaupt tief verschachtelt verwendet werden
sollten wo sie doch in jedem Handbuch ausführlich behandelt werden. Ich wollte keinen int als bool missbrauchen mir
ging es rein darum Ihm eine Möglichkeit zu bieten mehrere Fälle zu unterscheiden 1,2,3,4,5,6 usw.!

Aber wie gesagt mir persöhnlich gefällt deine Ausführung auch besser aber dafür ist doch so ein Forum unter anderem auch
da um Meinungen und verbesserungsvorschläge auszutauschen.

MfG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 27.01.14 12:58 
Zitat:
Was mich jedoch wundert
daß du mehr oder weniger sagst daß switch - case Konstrukte nur wenn überhaupt tief verschachtelt verwendet werden
sollten wo sie doch in jedem Handbuch ausführlich behandelt werden.


Switch case ist halt absolute Grundlage jeder Programmierung auch schon der rein strukturierten Programmierung. Im Objektorientierten Bereich hat ein switch aber oft ein geschmäckle und man sollte sich fragen ob hier nicht ein Konzept aus dem OO (zum Beispiel Polymorphie geeigneter wäre). Das gesagt (und ignoriert) würde ich persönlich in deinem Fall ein switch verwenden. Ein Dictionary empfinde ich als overkill erst Recht wenn man nicht die Tabs nimmt sondern ein string dazwischenschalten also enum -> string -> tab. Der String dazwischen ist eine Falle für den Compiler. Der Zusammenhang zwischen diesem String und dem String im Name des Tab ist vom Compiler nicht prüfbar und wird später mal zu einem Wartungsproblem wenn man einem Tab umbenennt. Erst recht wenn man Refactoring Werkzeug verwendet die denn Zusammenhang garantiert nicht erkennen. Ein Dictionary<Tabs, TabPage> also ein direktes Mapping zwischen dem Enum und den TabPage wäre da besser. Aber wie gesagt ich persönlich würde immer noch einfach ein switch nehmen um den Enum auf eine TabPage zu mappen. Das hält den Code für dieses überschaubare Problem lokal und verteil es nicht wie beim Dictionary. Dessen Definition, Initialisierung, Verwendung sind dann plötzlich mindestens an 3 verschiedenen Stellen im Code verteilt.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 27.01.14 15:30 
Zitat:
Aber wie gesagt ich persönlich würde immer noch einfach ein switch nehmen um den Enum auf eine TabPage zu mappen. Das hält den Code für dieses überschaubare Problem lokal und verteil es nicht wie beim Dictionary. Dessen Definition, Initialisierung, Verwendung sind dann plötzlich mindestens an 3 verschiedenen Stellen im Code verteilt.


Stimmt, das Tab direkt zu nehmen ist hier besser, hab ich nicht dran gedacht.
Mein Weg, das Problem bei Änderungen zu umgehen, war da ja die Idee, die Name-Property zu verwenden, dann muss der Name nicht mehr extra geschrieben werden. Das müsste beim Suchen ja eigentlich funktionieren, da ja auch diese Property verwendet wird, wenn man einen ab nach dem Namen aufruft.
Aber gleich das passende Objekt zu nehmen ist natürlich in jedem Fall sinnvoller :D


Das switch in eine eigene Methode zu legen und dann andere Code-Stellen zu sparen, ist allerdings ein gutes Argument.
Ich kann switch nicht leiden, aber ich geb zu, hier ist es wohl besser :D