Laden...

Drei gleiche SplitContainerPanels

Erstellt von Bonvie vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.865 Views
Bonvie Themenstarter:in
173 Beiträge seit 2006
vor 15 Jahren
Drei gleiche SplitContainerPanels

Hallo an alle,
ich grübele gerade über die SplitContainer-Klasse, die mir ja zwei Panels anbietet. Was aber mache ich idealer weise, wenn ich 3 brauche. Setze ich dann wirklich einen neuen SplitContainer in das zweite Panel ?

Ich möchte 3 Bereiche haben, die sich zu gleichen Teilen beim Aufziehen vergrößern.

Als nächstes möchte ich dort jeweils ein Panel/Bilder einbetten, das sich dann immer in der Mitte des SplitContainerPanels befindet, welche Dock und Anchor Option muss hierfür verwenden?

Wäre klasse wenn da jemand von Euch mit Erfahrung hier kurz ein paar klärende Worte fallen lassen könnte 😃

Danke und Gruß
Bonvie

D
496 Beiträge seit 2005
vor 15 Jahren

zu deiner ersten frage ich würde mal sagen: ja

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

F
10.010 Beiträge seit 2004
vor 15 Jahren

Wenn die Funktion zum vergrössern/verkleinern der einzelnen teile nicht benötugt werden,
benutze ein TableLayoutPanel.

R
158 Beiträge seit 2007
vor 15 Jahren

Wenn die Funktion zum vergrössern/verkleinern der einzelnen teile nicht benötugt werden,
benutze ein TableLayoutPanel.

*hüstel*
Wenn ich richtig lesen kann:

...Ich möchte 3 Bereiche haben, die sich zu gleichen Teilen beim Aufziehen vergrößern.

Als nächstes möchte ich dort jeweils ein Panel/Bilder einbetten, das sich dann immer in der Mitte des SplitContainerPanels befindet,...

Also kann man das Ganze ca. so angehen:

  1. SplitContainer1 auf die Form
  2. SplitContainer2 auf das rechte Panel von SplitContainer1
  3. auf die SplitContainerPanels jeweils irgendein Control plazieren
  4. Im Form_Resize-Event die SplitContainer entsprechend anpassen
  5. bei JEDEM SplitContainer.Panel das Event _Panel_Resize abonieren und mittels einer kleinen Berechnung das Control mittig platzieren

Als kleines Beispiel (gestestet!):

	public partial class Form2: Form
	{
		public Form2 ( )
		{
			InitializeComponent ( );
			//--SplitContainer anpassen
			//--SplitContainer2 liegt auf Panel2 des SplitContainer1
			splitContainer1.SplitterDistance = (int)( Width/3 );
			splitContainer2.SplitterDistance = (int)( splitContainer2.Width/2 );
		}

		private void splitContainer1_Panel1_Resize ( object sender, EventArgs e )
		{
			listView1.Location = new Point ((splitContainer1.Panel1.Width - listView1.Width)/2,
											(splitContainer1.Panel1.Height - listView1.Height)/2);
		}

		private void splitContainer2_Panel1_Resize ( object sender, EventArgs e )
		{
			monthCalendar1.Location = new Point ( ( splitContainer2.Panel1.Width - monthCalendar1.Width ) / 2,
												( splitContainer2.Panel1.Height - monthCalendar1.Height ) / 2 );
		}

		private void splitContainer2_Panel2_Resize ( object sender, EventArgs e )
		{
			dataGridView1.Location = new Point ((splitContainer2.Panel2.Width - dataGridView1.Width)/2,
												(splitContainer2.Panel2.Height - dataGridView1.Height)/2);
		}

		private void Form2_Resize ( object sender, EventArgs e )
		{	//--Breite der SplitContainer anpassen
			splitContainer1.SplitterDistance = (int)( Width / 3 );
			splitContainer2.SplitterDistance = (int)( splitContainer2.Width / 2 );
		}
	}

Anchor- oder Dock-Eigenschaften sind hier nicht zu bebrauchen.

Gruss
Rainer

F
10.010 Beiträge seit 2004
vor 15 Jahren

@raiguen:
Das TableLayoutPanle macht genau das, wenn man die einzelnen Zeilen/Spalten
mit % angibt.
Alle auf 33% gesetzt und schon wird das TLP beim vergrösseren des Panels
immer gleichmässig angepasst.

Bonvie Themenstarter:in
173 Beiträge seit 2006
vor 15 Jahren

Danke Euch allen, werde beides mal ausprobieren.
Da kein Konzept vorliegt bin ich noch frei 😃

Gruß
Bonvie

Bonvie Themenstarter:in
173 Beiträge seit 2006
vor 15 Jahren

Hallo an alle,
hier noch mal ein kurzes Feedback. Ich habe mich dann doch für die Variante von raiguen mit den 2 SplitContainer entschieden. Zwar habe ich nur eine resize Methode abonniert aber das ist eine individuelle Geschmacksrichtung.

Bei dem TableLayoutPanle kann man wohl nur ein Objekt in eine Zelle einbetten und muss dieses dann auch noch manuell ausrichten, wenn es in der Mitte stehen soll.

Jetzt funktioniert alles, allerdings sind in meiner ganzen Pixelberechungen immer 8 Pixel in der Breite verschwunden, obwohl die Margin auf 0 Pixel stehen. Weiß jemand warum ?

Gruß
Bonvie

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Bonvie,

vermutlich der Unterschied zwischen Form.Size.With und Form.ClientSize.Width

herbivore

R
158 Beiträge seit 2007
vor 15 Jahren

@raiguen:
Das TableLayoutPanle macht genau das, wenn man die einzelnen Zeilen/Spalten
mit % angibt.
Alle auf 33% gesetzt und schon wird das TLP beim vergrösseren des Panels
immer gleichmässig angepasst.

Okay, in diesem Falle ist das TLP mit nur einer Reihe und drei Spalten durchaus sinnvoll.

...Bei dem TableLayoutPanle kann man wohl nur ein Objekt in eine Zelle einbetten und muss dieses dann auch noch manuell ausrichten, wenn es in der Mitte stehen soll. JA, beim TLP kann pro Zelle nur ein Objekt eigefügt werden, was in der Regel dann oben links plaziert wird. Um dieses mittig zu arrangieren -> ALLE Anchor-Eigenschaften dieses Objekts auf NONE setzen (selbstredend ist Dock auch NONE !). Soll in einer TLP-Zelle mehrere Controls eigefügt werden, so ist zuerst ein sogenanntes Container-Object (Panel oder GroupBox) einzubetten mit DockStyle=Fill; auf diesem Container sind dann die weiteren gewünschten Controls zu platzieren.

...Jetzt funktioniert alles, allerdings sind in meiner ganzen Pixelberechungen immer 8 Pixel in der Breite verschwunden, obwohl die Margin auf 0 Pixel stehen. Weiß jemand warum ? Wie herbivore schon andeutete, gibt es einen geringfügigen Unterschied zwischen Form.Size.Width und Form.ClientSize.Width.
Ausserdem wäre bei den SplitContainern noch die SplitterWidth zu berücksichtigen, wenn man eine hinreichend gleiche Grösse der Panels erreichen möchte:

			splitContainer1.SplitterDistance = (int)( (ClientSize.Width - splitContainer1.SplitterWidth ) / 3 );
			splitContainer2.SplitterDistance = (int)( ( splitContainer2.Width  - splitContainer2.SplitterWidth ) / 2 );

Ich hab mal nen Screenshot von meiner DemoForm angehängt: im oberen Teil die beiden SplitContainer, im unteren Teil ein TLP. Bei den Zahlenwerten handelt es sich (zur Verdeutlichung) um die entsprechenden Breiten der Panels; die etwas abweichende Breiten bei den TLP-Zellen ist auf die jeweilige Margin-Eigenschaft des eingebetteten Containers zurückzuführen.

Gruss Rainer
[EDIT] Rechtschreibfehler korrigiert[/EDIT]