Laden...

Mit Forms eine art Frame einer Website nachbauen?

Erstellt von ingram333 vor 18 Jahren Letzter Beitrag vor 15 Jahren 12.104 Views
I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren
Mit Forms eine art Frame einer Website nachbauen?

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!

B
189 Beiträge seit 2004
vor 18 Jahren

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.

I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

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!

3.728 Beiträge seit 2005
vor 18 Jahren

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();
		}


I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

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!

140 Beiträge seit 2004
vor 18 Jahren

Würde statt einer zweiten Form ein UserControl nehmen dann hast du den Mist mit doppelten Rahmen und so nicht.

N
4 Beiträge seit 2005
vor 18 Jahren

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

I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

der Artikel ist klasse! Danke!

3.728 Beiträge seit 2005
vor 18 Jahren
Normale Forms

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.

I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

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!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo ingram333,

ich habe keinen Beispielcode für Usercontrols, aber dein eigentliches Problem leider auch nicht richtig verstanden. Also insbesondere nicht, was du mit

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.

I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

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^^

49.485 Beiträge seit 2005
vor 18 Jahren

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).

I
ingram333 Themenstarter:in
72 Beiträge seit 2005
vor 18 Jahren

wow, danke dir!!!

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

Danke nochmal!

3.728 Beiträge seit 2005
vor 18 Jahren
Usercontrols oder nicht

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.

F
10.010 Beiträge seit 2004
vor 16 Jahren

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

Noch eine Möglichkeit dieses Problem anzugehen.

J
130 Beiträge seit 2008
vor 15 Jahren

[...] 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**