none
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

    Samstag, 5. Oktober 2013 20:04

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.


    Sonntag, 6. Oktober 2013 13:21

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 KoopakillerMVP Sonntag, 6. Oktober 2013 08:39
    Samstag, 5. Oktober 2013 20:30
  • Hallo Tom,

    >>> SplitContainer sc = (SplitContainer)control;//

    Der Part hat mir gefehlt bzw ich war auf dem falschen Weg.

    Jetzt geht es wie ich es wollte.

    Danke für die Antwort


    Gruß Roland

    Sonntag, 6. Oktober 2013 07:15
  • 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

    Sonntag, 6. Oktober 2013 13:10
  • 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.


    Sonntag, 6. Oktober 2013 13:21
  • Hallo Tom,

    das war die Lösung. Danke.


    Gruß Roland

    Montag, 7. Oktober 2013 06:43
  • 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

    Donnerstag, 10. Oktober 2013 12:49
  • 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.

    Donnerstag, 10. Oktober 2013 13:47
  • 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

    Donnerstag, 10. Oktober 2013 19:03
  • 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.

    Donnerstag, 10. Oktober 2013 19:58