Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Mit Forms eine art Frame einer Website nachbauen?
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

Mit Forms eine art Frame einer Website nachbauen?

beantworten | zitieren | melden

Hallo folks! Also mal vorneweg, ich arbeite mich gerade erst in Forms ein und habe bislang ein paar kleine Tutorials gelesen, bin aber mit der Windowsprogrammierung nicht sonderlich vertraut. Ich wollte nun für eine kleinere Anwendung ein Form haben, dass an der linken Seite ein paar Buttons hat und das auf einen klick auf einen dieser, das "content" fenster (also ein Bereich neben den Buttons wie hier das Forum) sich ändert... so wie auf vielen Websites z.B. Meine Fragen nun: a) Ist das so sinnig, oder sollte man immer das gesamte mainform neu zeichnen? b) kann mir jemand ein codebeispiel dazu geben o. einen Link wo soetwas behandelt wird? ...fühle mich da derzeit etwas verloren in diesen Forms, mit einem Bsp. wirds sicher leichter gehen. Danke fürs lesen!
private Nachricht | Beiträge des Benutzers
bitstream
myCSharp.de - Member



Dabei seit:
Beiträge: 189
Herkunft: Hannover

beantworten | zitieren | melden

Du kannst für die verschiedenen Ansichten auf der rechten Seite UserForms erstellen, die du bei einem Buttonklick gegeneinander austauschst. Damit hast du den gewünschten "Effekt", und es spricht auch nichts gegen so ein Vorhaben.
private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

Danke für die schnelle Hilfe!

Na dann werde ich mich mal auf die suche nach etwas Beispielcode machen,
wäre auch supernett wenn jemand dazu etwas posten könnte!

Danke!
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

beantworten | zitieren | melden

Hallo ingram333,

Wenn ich es richtig verstanden habe, willst Du ein übergeordnetes Navigationsfenster bauen. Du kickst auf die Buttons (Ich würde ein TreeView für die Navigation nehmen, wie beim Windows-Explorer) und der Inhalt ändert sich.

Am besten setzt Du ein Panel in dem der Inhalt später angezeigt wird. Angenommen Du hast ein Form1 und ein Form2, wobei Form2 einen möglichen Content darstellen soll.

Beim klicken auf den Knopf zum anzeigen von Form2 würde folgender Code eine neue Instanz von Form2 innerhalb des Panels zeichnen:

	

		/// <summary>
		/// Wird ausgeführt, wenn auf "Button2" geklcikt wird.
		/// </summary>
		/// <param name="sender">Herkunftsobjekt</param>
		/// <param name="e">Ereignisargumente</param>
		private void btnShowForm2_Click(object sender, EventArgs e)
		{
			// Content Form erzeugen
			Form2 content = new Form2();
			content.TopLevel = false; 

			// Content Form auf das Panel setzen
			panel1.Controls.Add(content);
			
			// Content Form maximieren
			content.WindowState = FormWindowState.Maximized;

			// Content Form anzeigen
			content.Show();
		}

private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

Danke, genau sowas hab ich gesucht (bis auf das oben noch eine
weitere Leiste peim panel entsteht, aber da gibts ja sicher einen
Wert um die auf false zu setzen).

Kleine Fragen nur noch... wie designt man denn das 2. Form? Ich habe
hier bei #develop nur das Mainform im design (also drag&drop) Modus,
designe ich das auf dem und kopiere dann den src oder kann man
irgendwie ein zweites form daneben erstellen?

Hat das VisualStudio eigentlich mehr Vorlagen (also Buttons, Panels, etc.)
oder sind das die die es gibt?

Danke!
private Nachricht | Beiträge des Benutzers
Snowwolf3000
myCSharp.de - Member

Avatar #avatar-3109.jpg


Dabei seit:
Beiträge: 142
Herkunft: Süddeutschland

beantworten | zitieren | melden

Würde statt einer zweiten Form ein UserControl nehmen dann hast du den Mist mit doppelten Rahmen und so nicht.
private Nachricht | Beiträge des Benutzers
neudorfer_christian
myCSharp.de - Member



Dabei seit:
Beiträge: 4

beantworten | zitieren | melden

Hi,

habe vor Kurzem folgenden Artikel gefunden, in dem ein Konzept für ein sehr einfaches Applikationsframework beschrieben wird:
http://www.devexpress.com/Support/BestPractices/.NET/SAP/#1

Sobald die Anzahl der an zu verwaltenden Panels steigt, bieten die im Artikel beschriebenen "Module" eine elegante Lösung...

Christian
private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

der Artikel ist klasse! Danke!
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Normale Forms

beantworten | zitieren | melden

Zitat
Kleine Fragen nur noch... wie designt man denn das 2. Form? Ich habe
hier bei #develop nur das Mainform im design (also drag&drop) Modus,
designe ich das auf dem und kopiere dann den src oder kann man
irgendwie ein zweites form daneben erstellen?

Hat das VisualStudio eigentlich mehr Vorlagen (also Buttons, Panels, etc.)
oder sind das die die es gibt?

Du erstelltst einfach ein zweites Form und designst es. Den Aufruf innerhalb des Hauptformulars musst Du im Code zur Laufzeit vornehmen.

Wenn Du das untergeordnete Formular nur an dieser Stelle brauchst, solltest Du wirklich besser ein UserControl anstatt eines 2. Forms verwenden. Anders sieht es aus, wenn das 2. Form an einer anderen Stelle als Dialog verwendet werden soll.
private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

hi folks,

der thread ist zwar schon etwas älter, aber für mich gerade wieder aktuell.

ich hab das Forum mal komplett nach UserControls abgesucht, aber es
war leider nirgens ein Beispielcode zu finden, hat jemand von euch vielleicht
Lust da schnell mal ein paar Zeilen zu posten? Denke das wäre auch etwas
für die FAQ, da ziemlich viele Postings nach einer aufteilung des Formulars
in "Navigation" und "Content" fragen.

Im Endeffekt soll es so aussehen:

1|BBB
2|BBB
3|BBB

Ich klicke in meiner Navi auf die PictureBox mit dem Namen 1:

1|AAA
2|AAA
3|AAA

Soweit ich das durch die anderen Threads erschliessen kann, gibt es dafür
drei Möglichkeiten:

1) Splitter + Panels
Glaube das nicht ganz was ich brauche

2) MDI
Das glaub ich fast zu viel, obwohl es sicher geht.

3) UserControl

Wäre jemand bereit für 2) oder 3) etwas Beispielcode zu posten?
Denke damit wäre nicht nur mir sehr geholfen^^

Danke!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ingram333,

ich habe keinen Beispielcode für Usercontrols, aber dein eigentliches Problem leider auch nicht richtig verstanden. Also insbesondere nicht, was du mit
Zitat
1|BBB 1|AAA
2|BBB 2|AAA
3|BBB 3|AAA
ausdrücken wolltest.

herbivore

PS: Ich glaube, jetzt habe ich es! Das ist doch aber kein Job für ein Usercontrol - finde ich. Das geht doch ganz simpel mit mehreren Panels.
private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

ich meinte damit dieses "aufteilen eines Forms in zwei Teile".
Beide Teile sollen wie ein eigenes Form sein, verändern
tut sich aber immer nur das rechte auf Mausklick in eine
Picturebox auf der linken seite.

Also wie hier auf der Website von mycsharp.de, du hast links
eine Navigation die immer statisch bleibt, während sich der
Content (hier z.B. das Forum) auf einen klick ind er Navi
ändert (oder auch durch einen klick im Content selbst).

Genau das würde ich gerne mit Forms umsetzen.

UserControls wird in meinem C# Buch leider nur eine
halbe Seite lang erwähnt, so ganz kapier ich nicht wie
mir die helfen könnten.

Wenn es mit Panels problemlos geht, würde ich das
auch versuchen.

Wie gesagt, ein Beispiel wäre sehr hilfreich^^
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ingram333,

ok, hier kommt ein Beispiel:


using System;
using System.Windows.Forms;
using System.Drawing;

//*****************************************************************************
public class MyWindow : Form
{
   const int iWidth            = 600;
   const int iHeight           = 480;
   const int iMargin           = 10;
   const int iNavigationWidth  = 200;
   const int iButtonWidth      = 80;
   const int iNumContentPanels = 3;

   private Panel    _pnlNavigation;
   private Panel [] _apnlContent = new Panel [iNumContentPanels];
   private Panel    _pnlButtons;

   private ListBox  _lbxNavigation;

   private Button   _pbOk;
   private Button   _pbCancel;

   //==========================================================================
   public MyWindow ()
   {
      Control  ctrlCurr;
      Control  ctrlPrev;
      Control  ctrlCurrContainer;

      Text = "Frames";
      ClientSize = new Size (iWidth, iHeight);
      MinimumSize = new Size (iNavigationWidth * 3 / 2, 150);

      //-----------------------------------------------------------------------
      // (Haupt-)Panels
      // (Die Reihenfolge des Hinzufügens ist wichtig!)
      //-----------------------------------------------------------------------

      //-----------------------------------------------------------------------
      ctrlCurrContainer = this;

      //-----------------------------------------------------------------------
      for (int i = 0; i < iNumContentPanels; ++i) {
         ctrlCurr = _apnlContent [i] = new Panel ();
         ((Panel)ctrlCurr).BorderStyle = BorderStyle.Fixed3D;
         ((Panel)ctrlCurr).BorderStyle = BorderStyle.FixedSingle;
         ctrlCurr.Dock = DockStyle.Fill;
         ctrlCurr.TabIndex = 2;
         ctrlPrev = ctrlCurr;
         ctrlCurrContainer.Controls.Add (ctrlCurr);
      }

      _apnlContent [0].BackColor = Color.Green;
      _apnlContent [1].BackColor = Color.Orange;
      _apnlContent [2].BackColor = Color.Yellow;

      //-----------------------------------------------------------------------
      ctrlCurr = _pnlNavigation = new Panel ();
      ctrlCurr.BackColor = Color.Red;
      ((Panel)ctrlCurr).BorderStyle = BorderStyle.Fixed3D;
      ((Panel)ctrlCurr).BorderStyle = BorderStyle.FixedSingle;
      ctrlCurr.Width = iNavigationWidth;
      ctrlCurr.Dock = DockStyle.Left;
      ctrlCurr.TabIndex = 1;
      ctrlPrev = ctrlCurr;
      ctrlCurrContainer.Controls.Add (ctrlCurr);

      //-----------------------------------------------------------------------
      ctrlCurr = _pnlButtons = new Panel ();
      ctrlCurr.BackColor = Color.Blue;
      ((Panel)ctrlCurr).BorderStyle = BorderStyle.Fixed3D;
      ((Panel)ctrlCurr).BorderStyle = BorderStyle.FixedSingle;
      ctrlCurr.Dock = DockStyle.Bottom;
      ctrlCurr.TabIndex = 3;
      ctrlPrev = ctrlCurr;
      ctrlCurrContainer.Controls.Add (ctrlCurr);


      //-----------------------------------------------------------------------
      // Inhalt von _pnlNavigation
      //-----------------------------------------------------------------------

      //-----------------------------------------------------------------------
      ctrlCurrContainer = _pnlNavigation;

      //-----------------------------------------------------------------------
      ctrlCurr = _lbxNavigation = new ListBox ();
      ctrlCurr.Location  = new Point (iMargin, iMargin);
      ((ListBox)ctrlCurr).IntegralHeight = false;

      ((ListBox)ctrlCurr).Items.Add ("Panel1");
      ((ListBox)ctrlCurr).Items.Add ("Panel2");
      ((ListBox)ctrlCurr).Items.Add ("Panel3");
      ctrlCurr.Size = new Size (ctrlCurrContainer.ClientSize.Width
                                - 2 * iMargin,
                                ctrlCurrContainer.ClientSize.Height
                                - 2 * iMargin);
      ctrlCurr.Anchor = AnchorStyles.Left
                      | AnchorStyles.Right
                      | AnchorStyles.Top
                      | AnchorStyles.Bottom;
      ((ListBox)ctrlCurr).SelectedIndexChanged
         += new EventHandler (NavigationSelectedIndexChanged);
      ctrlPrev = ctrlCurr;
      ctrlCurrContainer.Controls.Add (ctrlCurr);

      //-----------------------------------------------------------------------
      // Inhalt von _apnlContent [1..n]
      //-----------------------------------------------------------------------
      // ...

      //-----------------------------------------------------------------------
      // Inhalt von _pnlButtons
      //-----------------------------------------------------------------------

      //-----------------------------------------------------------------------
      ctrlCurrContainer = _pnlButtons;

      _pbOk = new Button ();
      _pnlButtons.Height = _pbOk.Height + (2 * iMargin)
                      + _pnlButtons.Height
                      - _pnlButtons.ClientSize.Height;

      //-----------------------------------------------------------------------
      ctrlCurr = _pbCancel = new Button ();
      ctrlCurr.Width = iButtonWidth;
      ctrlCurr.Location = new Point (ctrlCurrContainer.Width
                                     - ctrlCurr.Width
                                     - iMargin,
                                     iMargin);
      ctrlCurr.Anchor = AnchorStyles.Right | AnchorStyles.Bottom;
      ctrlCurr.Text = "Abbrechen";
      ctrlCurr.Click += new EventHandler (CancelClick);
      ctrlCurr.TabIndex = 2;
      ctrlPrev = ctrlCurr;
      ctrlCurrContainer.Controls.Add (ctrlCurr);

      //-----------------------------------------------------------------------
      ctrlCurr = _pbOk;
      ctrlCurr.Width = iButtonWidth;
      ctrlCurr.Location = new Point (ctrlPrev.Left - ctrlCurr.Width - iMargin,
                                     iMargin);
      ctrlCurr.Anchor = AnchorStyles.Right | AnchorStyles.Bottom;
      ctrlCurr.Text = "Ok";
      ctrlCurr.Click += new EventHandler (OkClick);
      ctrlCurr.TabIndex = 1;
      ctrlPrev = ctrlCurr;
      ctrlCurrContainer.Controls.Add (ctrlCurr);

      //-----------------------------------------------------------------------
      // Nacharbeiten
      //-----------------------------------------------------------------------
      AcceptButton = _pbOk;
      CancelButton = _pbCancel;

      _lbxNavigation.SelectedIndex = 0;
   }

   //==========================================================================
   protected void NavigationSelectedIndexChanged (Object objSender,
                                                  EventArgs ea)
   {
      ListBox lbxSender = (ListBox)objSender;

      if (lbxSender.SelectedIndex < 0) {
         // nichts zu tun
         return;
      }
      _apnlContent [lbxSender.SelectedIndex].BringToFront ();
   }

   //==========================================================================
   protected void OkClick (Object objSender, EventArgs ea)
   {
      //-----------------------------------------------------------------------
      // Speichen
      //-----------------------------------------------------------------------
      //...

      //-----------------------------------------------------------------------
      // Fenster schließen
      //-----------------------------------------------------------------------
      Close ();
   }


   //==========================================================================
   protected void CancelClick (Object objSender, EventArgs ea)
   {
      //-----------------------------------------------------------------------
      // Fenster schließen
      //-----------------------------------------------------------------------
      Close ();
   }
}

//*****************************************************************************
abstract class App
{
   public static void Main (string [] astrArg)
   {
      Application.Run (new MyWindow ());
   }
}
Die Farben und Rahmen der Panel sind natürlich nur dafür, dass man den Aufbau besser sieht und auch sieht, was passiert. Im fertigen Programm würde man Farben und Rahmen weglassen.

herbivore

PS: Das Beispiel wurde ohne Verwendung des VS-Designer erstellt. Wenn man den VS-Designer verwenden will, geht das auch. Dann sollte man statt Panels jedoch UserControls verwenden, weil man die sich gegenseitig verdeckenden Panels im Designer schlecht bearbeiten kann. UserControls kann man dagegen eigenständig bearbeiten (und dann anschließend in das Fenster ziehen und übereinander legen).

PPS: Diesen Beitrag gibt es mittlerweile - mit mehr Erklärungen und beschreibendem Text - in der FAQ: [FAQ] Mit Forms eine Art Frameset einer Website nachbauen? (Navigation, Wizard, Assistent).
Attachments
private Nachricht | Beiträge des Benutzers
ingram333
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

wow, danke dir!!!

Schlage den Thread hiermit für die FAQ vor, das wird sicher einigen
Leuten helfen!

Danke nochmal!
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Usercontrols oder nicht

beantworten | zitieren | melden

Ob man UserControls baut oder alles auf einem Formular mit Standard-Controls unterbringt, hängt vom Anwendungsfall ab.

Wenn Du z.B. ein TreeView für eine einfache Navigation benötigst, wäre ein UserControl nicht geeignet.

Um aber z.B. eine kompakte Preislistenverwaltung mit einem ListView, umfangreichen Kontextmenüs und Bearbeitungsmöglichkeiten mit Eigabevalidierung zu bauen, würde ich alles in einem UserControl machen. Das hat den Vorteil, dass die Preislistenverwaltung auf mehreren unterschiedlichen Formularen einfach eingesetzt werden kann. Du schaffst dadurch ein Stück wiederverwandbare Software.

Auch in einer MVC (Model View Controller) inspirierten GUI machen UserControls als Views Sinn.

Wichtig ist es, UserControls als Komponenten zu sehen. Komponenten müssen autonom sein. Sie dürfen nicht nur mit einem bestimmten Formular funktionieren oder von diesem abhängig sein. Eine saubere Schnittstelle und wohl definierte Events sollten deshalb für jedes UserControl erstellt werden.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

http://www.codeproject.com/useritems/multipane_control.asp

Noch eine Möglichkeit dieses Problem anzugehen.
private Nachricht | Beiträge des Benutzers
Jimpanse
myCSharp.de - Member



Dabei seit:
Beiträge: 134
Herkunft: C:\Windows\Temp

beantworten | zitieren | melden

Zitat von Rainbird
[...] Am besten setzt Du ein Panel in dem der Inhalt später angezeigt wird. Angenommen Du hast ein Form1 und ein Form2, wobei Form2 einen möglichen Content darstellen soll. [...]

super, danke

hat mir sehr weitergeholfen
“DOH !” -Homer Simpson
private Nachricht | Beiträge des Benutzers