Autor Beitrag
mmp5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 03.12.09 00:04 
Also möchte folendes realisieren:

1. Eine Form, die sich bei Start öffnet
2. dann soll man aus 12 Kategorien eine wählen können (z.B. Sportartikel, Uhren, Hemden, Handtaschen, ... usw. )
3. Es soll dann in der selben Fenster die Kategorie geöffnet werden und die Bilder und Preise dazu angezeigt werden
4. Man soll auf einen "zurück" Button wieder auf die Kategorieseite kommen


Meine Frage:
Wie realisiere ich das mit den Forms, sodass alle Elemente in einem Fenster angezeigt werden?
Muss ich wirklich alle 12 Kategorien in eigenen Forms laden und alle verstecken und dann auf klick einblenden oder kann ich alles in eine Packen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.12.09 00:45 
Hallo und :welcome:!

Ich würde für jede Kategorie ein eigenes UserControl erstellen und Du bindest in Deine Form dann immer das Passende ein. Das dürfte eigentlich die sauberste Lösung sein.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
mmp5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 03.12.09 23:06 
Also ich habe das Problem jetzt wie folgt gelöst:

1. ich habe mit rechtklick(auf's projekt) -> Hinzufügen -> Benutzersteuerelement... -> Benutzersteuerelement ein UserControl1 hinzugefügt
*Das habe ich dann mehrmals wiederholt

2. ich habe beim laden des Fensters das erste UserControl reingeladen mittels:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void Form1_Load(object sender, EventArgs e)
        {
            UserControl1 uc = new UserControl1();
            this.Controls.Add(uc);
        }

3. Ich habe auf dem UserControl1 Entwurf einen Button platziert und ein Event hinzugefügt welches das zweite UserControl laden soll und das erste verstecken/löschen soll
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private void button1_Click(object sender, EventArgs e)
        {
            this.Controls.Clear();
            UserControl2 uc2 = new UserControl2();
            this.Controls.Add(uc2);
            
        }

Das selbe habe ich als zurück-button auf dem UserControl2, UserControl3, UserControl4 ... gemacht
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        private void button1_Click(object sender, EventArgs e)
        {
            this.Controls.Clear();
            UserControl1 uc = new UserControl1();
            this.Controls.Add(uc);
        }



Meine Frage jetzt:
Ist das "Richtig/Professionell" so?
Oder geht das noch besser?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.12.09 23:21 
Hallo!

Nee, so würde ich das nicht machen. Du solltest immer nur die Form die UserControls erstellen lassen. Bei Deinem System hast Du ja dann irgendwann UserControl in UserControl in UserControl ...

Ich würde mir in der Form ein Array vom Typ UserControl[] anlegen, welches 12 Einträge hat (entsprechend Deinen 12 Kategorien). Soll jetzt z.B. Kategorie #5 angezeigt werden, guckst Du nach, ob in Deinem Array an der passenden Stelle schon eine Instanz des passenden UserControls liegt. Wenn die schon da ist, zeigst Du die an und erstellst keine neue. Ist die noch nicht da, erstellst Du einmalig eine neue Instanz, speicherst sie im Array und zeigst sie an.

Auf diese Weise stellst Du sicher, dass Du wirklich nur pro Kategorie ein UserControl erzeugst.

Die Buttons "Weiter" und "Zurück" würde ich übrigens außerhalb der UserControls, nämlich auf de Form, platzieren, dann kannst Du auch direkt in der Form auf die Events reagieren.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
mmp5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 04.12.09 16:16 
Danke für den Tipp, denn nach ca. 30 mal Klicken ist das Programm abgestrüzt

Also ich habs es jetzt wie Folgt gelöst:

1. Ich habe wieder ein UserControl.cs hinzugefügt und bearbeitet
2. ich habe auf der MainForm meine KategorieButtons platziert (Button1 = ZurückButton, Button2 = Kategorie1_UserControl)
3. ich habe eine neue Klasse hinzugefügt (cUserControl1_12.cs ) und in diesen den Array gepackt
ausblenden C#-Quelltext
1:
2:
3:
4:
class cUserControl1_12
    {
            public UserControl[] uc_a = new UserControl[12];     
    }

4. ich habe in der Form1.cs ein Objekt der Klasse erstellt
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public partial class Form1 : Form
    {
        cUserControl1_12 uc_s = new cUserControl1_12();
        public Form1()
        {
            InitializeComponent();
        }
        ...
    }


5. Ich habe auf Button-Kategorie1-Click das UserControl1 erstellen lassen oder nur zuweisen lassen
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
private void button2_Click(object sender, EventArgs e)
        {

            if (uc_s.uc_a[0] == null//uc_s = klasse, uc_a= ArrayVonUserControls
            {   //erstelle ein neues UserControl1 Objekt, falls noch keins vorhanden ist
                uc_s.uc_a[0] = new UserControl1();
                this.Controls.Add(uc_s.uc_a[0]);
            }
            else
            {   //platziere das Objekt
                this.Controls.Add(uc_s.uc_a[0]); 
            }

                this.button1.Visible = true//zurück-Button-einblenden
 
        }


6. Auf dem Zurück-Button habe ich dann
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 12; i++)
                this.Controls.Remove(uc_s.uc_a[i]);

            this.button1.Visible = false//zurück-Button-ausblenden
        }

ich musste den Array so durchlaufen, da mit this.Controls.clear() -> alle Elemente gelöscht werden


2. Kleine Fragen noch:
Ist das so, wie du dir das gedacht hattest? (Das Programm stürzt auch bei 100 mal klicken nicht ab ;) )
Wenn ich das UserControl einbinde sehe ich immer noch die Buttons auf Form ... muss ich für alle Elemente die auf der MainForm1 sind wirklich *.Visible=false;? Oder gibt es eine Eigenschaft vom UserControl, welche den Background nicht transparent macht, oder das Usercontrol in den Vordergrund legt?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 04.12.09 16:47 
Wenn du den "Zurück"-Button auf der Hauptseite gar nicht angezeigt haben willst, würde ich zwei übergeordnete UserControls einführen:
Eines eben für die Hauptseite, das nur das Auswahlmenü beinhaltet.
Bei Auswahl wird das erste UC (also der einzige Inhalt der Form) durch das zweite ersetzt, welches den "Zurück"-Button und das entsprechende UC für die gewählte Kategorie enthält. Die Verwaltung der 12 Kategorien-UCs fällt damit ganz an dieses zweite UC, die Form hat damit nichts mehr zu tun!

PS: Besitzen denn alle Kategorien ein unterschiedliches Layout/statischen Inhalt? Wenn nicht, sollte es doch möglich sein, diese durch ein allgemeines UC zu ersetzen, das dynamisch die entsprechenden Daten zur Anzeige erhält.
PPS: Wenn du faul sein willst, kannst du auch problemlos jedes Mal ein neues UC erstellen, das dürfte niemanden stören ;) .

_________________
>λ=