Benutzer mit den meisten Antworten
SplitContainer in Form finden und SplitterDistance auslesen

Frage
-
Hallo Forum,
ich kann zwar in einer Form alle SplitContainer finden, aber wie kann ich aus den gefundenen SpliContainern die
SplitterDistance und andere Eigenschaften auslesen.
Bem : Ich möchte das universell lösen, indem ich alle Controls in der Form durchgehe und dann eben die Namen in der
Form nicht wissen muss.
Bin für jeden Hinweis dankbar.
Gruß Roland
Gruß Roland
Antworten
-
Wenn du die Name-Eigenschaft hast, dann ist das zum Glück auch nicht sehr schwer:
(this.Controls["SplitContainer1"] as SplitContainer).SplitterDistance = 50; // SpliContainer1 ist der Wert der Name-Eigenschaft.
Das Control wird also über den Namen abgerufen (funktioniert auch bei dynamisch hinzugefügten Controls) und in einen SplitContaienr gecastet. Von diesem können dann wieder die Eigenschaften gesetzt werden (Natürlich auch ausgelesen).
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Bearbeitet Tom Lambert (Koopakiller) Sonntag, 6. Oktober 2013 13:22
- Als Antwort vorgeschlagen Elmar Boye Montag, 7. Oktober 2013 08:48
- Als Antwort markiert Roland DE Freitag, 18. Oktober 2013 09:09
Alle Antworten
-
Hallo,
wie auch immer du die einzelnen Controls erhählst, irendwie hast du ja das Objekt bekommen. Beispielsweise so:foreach (Control control in this.Controls)//Controls durch gehen { if(control is SplitContainer )//Ist das Control ein SplitContainer { SplitContainer sc = (SplitContainer)control;//Das ist jetzt ein SplitContainer
Dieses Objekt (sc) enthält nun auch die Daten des eigentlichen SplitContainers. Um mal ein Beispiel zum Auslesen der Breiten zu nennen:MessageBox.Show("Breite 1:" + sc.Panel1.Width + "\nBreite 2:" + sc.Panel2.Width);
So kannst du jede Eigenschaft auslesen und auch setzen.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort vorgeschlagen Tom Lambert (Koopakiller) Sonntag, 6. Oktober 2013 08:39
-
Hallo Tom,
ein Problem hab ich aber noch. Jetzt habe ich die Daten für den SplitContainer in meiner DB.
Habe also den Namen des SplitContainers und andere Werte.
Aber wie kann ich jetzt mit den Daten die in einer Tabelle habe die Objekte in der Form wieder ansprechen ?
mit >>SplitContainer sc = (SplitContainer)TabName.Row[i]["Name"]
geht es ja nicht. hast Du da noch eine Lösung ?
Danke.
Gruß Roland
-
Wenn du die Name-Eigenschaft hast, dann ist das zum Glück auch nicht sehr schwer:
(this.Controls["SplitContainer1"] as SplitContainer).SplitterDistance = 50; // SpliContainer1 ist der Wert der Name-Eigenschaft.
Das Control wird also über den Namen abgerufen (funktioniert auch bei dynamisch hinzugefügten Controls) und in einen SplitContaienr gecastet. Von diesem können dann wieder die Eigenschaften gesetzt werden (Natürlich auch ausgelesen).
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Bearbeitet Tom Lambert (Koopakiller) Sonntag, 6. Oktober 2013 13:22
- Als Antwort vorgeschlagen Elmar Boye Montag, 7. Oktober 2013 08:48
- Als Antwort markiert Roland DE Freitag, 18. Oktober 2013 09:09
-
Hallo Thom,
eine Frage hab ich aber noch.
Ich habe einen SplitContainer in einem anderen SplitContainer oder in einem TabelLayotPanel
Wenn ich dann die Änderung direkt mache :
splitContainer5.SplitterDistance = 20;
dann geht es ,
wenn ich aber
(this.Controls["splitContainer5"] asSplitContainer).SplitterDistance = 20;
dann geht es nicht und ich bekomme eine Fehlermeldung.
Was ist der Unterschied und was muss ich machen, das es in allen Objekten funktioniert ?
Gruß Roland
-
Hallo,
Angenommen du hast einen Splitcontainer A in einem Splittcontainer B. B kannst du ganz einfach über den Namen ermitteln. A auch, aber nur wenn du die Suche in B statt findet.((this.Controls["splitContainer1"] as SplitContainer).Panel2.Controls["splitContainer2"] as SplitContainer).SplitterDistance = 50;
Dabei liegt der SpliContainer2 im rechten Panel von SpliContainer1.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Thom,
das bedeutet ich muss dann die ganze Form wieder in einer Schleife durchsuchen. Quasi so wie ich die splitContainer auch gefunden habe
nur "rüchwerts".
Aber warum wird der splitContainer gefunden auch wenn er in einem anderen Objekt ist, wenn ich direkt im Code schreib :
this.splitContainer5.SplitterDistance = 20;
Der ist auch in einem anderen Objekt der Code wird aber ausgeführt.
Warum muss ich den "kpl. Pfad" wissen wenn ich es über Variablen machen will ?
((this.Controls["splitContainer1"] as SplitContainer).Panel2.Controls["splitContainer2"] as SplitContainer).SplitterDistance = 50;
Gruß Roland
-
Das ist die Logik des Designers. Wenn du in die *.Designer.cs hinein guckst, dann siehst du, das dort die SplitContainer angelegt und initialisiert werden. Anschließend wird dem SplitContainer1 der SplitContainer2 als Kind zugewiesen. Da die Variablen aber alle in der Form erstellt werden, kann man in diesem Fall auch ohne "Pfad" darauf zugreifen.
Wenn du die GenerateMember-Eigenschaft auf False stellst, dann würden auch die Variablen nicht erstellt werden und man müsste immer über den "Pfad" darauf zugreifen.
Wie du richtig erkannt hast, läuft das wieder zuweisen der Eigenschaften in der Regel genau rückwerts zum Auslesen. Ein paar Unterschiede gibt es natürlich. Aber diese spielen eigentlich nur beim Verschachteln von Controls eine Rolle.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.