JüTho hat folgendes geschrieben : |
| Schau einfach in der SDK-Doku/MSDN nach, was die TabControlCancelEventArgs an Informationen liefern. |
Nemag hat folgendes geschrieben : |
| Ich denke mal die EventArgs hat er schon gefunden gehabt, seine Frage zielt ehr daraufhin ab ob er direkt aus dem Selecting eine Eigenschaft irgendwoher auslesen kann die ihm die vorherige Page sagt. |
Richtig.
Ralf Jansen hat folgendes geschrieben : |
| Das TabControl merkt sich intern den Index der letzten Auswahl( lastSelection Variable - im Reflector nachgesehen) um bei einem Cancel im Selecting Event die letzte Page wieder auswählen zu können. Die Variable wird aber leider nicht veröffentlicht. Mußt dir also was über das Deselecting Event basteln. |
Also mehrere Möglichkeiten:
- Ableiten und lastIndex veröffentlichen.
- Ableiten und Eigenschaft als Hilfsvariable implementieren. Da ich dann aber schon beim Ableiten bin, dann doch gleich Variante 1. verwenden.
- Beim Ableiten am besten eine Methode implementieren, die Inhalte umhängt. Dann braucht man lastIndex nicht. Aber ich kann mir vorstellen, dass ich lastIndex irgendwann mal brauche. Bei Delphi öfters mit den TabReferenzen gearbeitet. Also beide, lastIndex und die neue Reallocate-Methode, veröffentlichen.
- Solange man die Eigenschaft Tag nicht anderweitig verwendet, einfach nachfolgenden Code verwenden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void tabControl01_Selecting(object sender, TabControlCancelEventArgs e) { foreach (Control C in ((TabControl)sender).TabPages[(int)((TabControl)sender).Tag].Controls) { C.Parent = e.TabPage; } }
private void tabControl01_Deselecting(object sender, TabControlCancelEventArgs e) { ((TabControl)sender).Tag = ((TabControl)sender).TabPages.IndexOf(e.TabPage); } |
[edit]
Selecting-Event geändert
Grund: Mit foreach funktioniert es nicht. Wenn das erste Element umgehangen wird, dann verkürzt sich die Liste der Controls und der Index 1 auf die vorher erste Control zeigt nun auf die zweite Control. Daher jetzt eine dekrementelle For-Schleife verwendet.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private void tabControl01_Selecting(object sender, TabControlCancelEventArgs e) { System.Windows.Forms.Control.ControlCollection clpControls = ((TabControl)sender).TabPages[(int)((TabControl)sender).Tag].Controls; for (int I = clpControls.Count - 1; I >= 0; I--) { clpControls[I].Parent = e.TabPage; } } |
[/edit]
Ralf Jansen hat folgendes geschrieben : |
| Aber warum zeigst du alle Controls auf allen Tabpages an? Das hört sich für mich sinnfrei an. Wenn das gewollt ist würde ich für die Controls einfach nicht eine TabPage als Parent benutzen sondern als Parent der Controls die Form benutzen sie aber trotzdem vor dem TabPage anzeigen. Dann kannst du dir das Umhängen sparen. |
Dann kann ich z.B. auch mal die TabControl ausblenden, neu belegen, etc, ohne erst irgendwelche Elemente, die nicht auf dem Tab liegen im Form zu suchen und zu verarbeiten. Ich bin schon darauf aus, den logischen Kontext zu erhalten, also "was gehört wo rein und ist Parent von wem?".
In Delphi gab es ja Frames. Bei C# habe ich bisher noch keine ähnliche Control gefunden. Daher direkt über Controls, oder ich benutze in Tabs eine GroupBox für alle.
Danke. Problem gelöst. Evtl. gibt es noch paar interessante Vorschläge von Euch. Bin gespannt.
Edit: Achso. Frage des Unwissenden: Der Reflector ist was? Ich verwende i. d. R. F12 um in den Code einer Klasse zu gelangen.