Laden...

Panel aus Klasse heraus neuladen klappt nicht

Erstellt von xp21xp vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.724 Views
X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren
Panel aus Klasse heraus neuladen klappt nicht

Abend

Eigentlich ist es nur eine Kleinigkeit aber trotzdem klappt es nicht bzw weiß ich keinen Lösungsansatz mehr wie es klappen könnte.

Es geht darum das ich auf der Form ein Panel mit dem Namen GrundPanel habe.
In einer Klasse gibt es eine Methode die beim Aufrufen auf das Panel verschiedene Buttons legt. Soweit so gut, das klappt alles wie es soll. Nun möchte ich aber die Methode mehrfach aufrufen und das Panel dann immer Updaten so dass das Panel alle Buttons die neu erzeugt wurden ebenfalls beinhaltet.

Ich überprüfe ob die Form bereits offen ist wenn nein dann wird ShowDialog aufgerufen wenn ja sollte das Panel neu geladen werden und wieder angezeigt doch egal wie ich es versuche es wird nicht mehr angezeigt.

this.Controls.Remove(GrundPanel);
            this.Controls.Add(GrundPanel);
            GrundPanel.Visible = true;
            GrundPanel.BringToFront();
            GrundPanel.Show();

Mit dieser Abfolge wird das Panel neu geladen jedoch kann ich diese nur so verwenden wenn ich sie direkt in die Form schreibe. Aufgrund dessen das meine Methode in einer Klasse steht kann ich die Abfolge auch nur von dort aus Aufrufen und dann passiert nichts egal wie ich habe alles ausprobiert
es passiert absolut nix.
Gibt es nicht noch eine andere Methode so etwas wie Refresh was jedoch auch nicht funktioniert??

PS: Bin kein Profi also Learning by doing hoffe es ist trotzdem verständlich 😁

Gruß Tino

 Form currentForm = Application.OpenForms["Programm"];
                        if (currentForm == null)
                        {
                            p.ShowDialog();
                        }
                        else
                        {
                            //Hier soll das Panel neugeladen werden


                        }
P
441 Beiträge seit 2014
vor 5 Jahren

Du müsstest das Panel so definieren, dass es von der anderen Klasse aus zugegriffen werden kann.

Allerdings vermischt du dabei UI mit Logik Aufgaben. Besser wäre, du stellst von deiner Klasse aus eine Collection (z.B. ObservableCollection<T>) als Public Property zur Verfügung, auf dessen Änderung deine Form reagieren kann und das Panel neu rendert.
Die ObservableCollection<T> bietet dabei bereits Events an, die bei Änderung aufgerufen werden. Das hat den Nachteil, dass wenn du mehrere Sachen änderst, jedesmal das Panel neugeladen werden könnte. Daher wäre hier eine mögliche Lösung, eine normale Collection zu verwenden und ein eigenes Event zu definieren.

X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren

Vielen Dank für deine Antwort!

Ich habe nun eine Lösung mit der es Funktioniert jedoch ist das ganze noch ziemlich umständlich vielleicht hat jemand ein Verbesserungs Vorschlag

In meiner Form ist das Panel p Deklariert und wird beim aufrufen der Form so zugewiesen:


            p.AutoScroll = true;
            p.BackColor = System.Drawing.Color.Aquamarine;
            p.Location = new System.Drawing.Point(0, 100);
            p.Name = "panel2";
            p.Size = new System.Drawing.Size(1055, 590);
            p.TabIndex = 196;
            p.Show();

            this.Controls.Add(p);
            ProgrammAufruf.myCollection.Add(p);

In der Klasse gibt es einmal die Collection und ein weiteres Panel


 public static ObservableCollection<Panel> myCollection = new ObservableCollection<Panel>();
        Panel p1 = new Panel();


//Namen des Controls
        public static Button B1;
        public static Button B2;
        public static Button B3;
        public static Button B4;
        public static Button B5;
        public static Button B6;
        public static Button B7;
        public static Button B8;
        public static Button B9;
        public static Button B10;

        //1Satz / Namen für die Transformation
        public Button BB1 = new Button();
        Label F1 = new Label();
        Label K1 = new Label();
        Panel P11 = new Panel();
        Panel P211 = new Panel();
        MaskedTextBox MaskedTextBoxY = new MaskedTextBox();

        public Button BB2 = new Button();
        Label F2 = new Label();
        Label K2 = new Label();
        Panel P12 = new Panel();
        Panel P212 = new Panel();

        public Button BB3 = new Button();
        Label F3 = new Label();
        Label K3 = new Label();
        Panel P13 = new Panel();
        Panel P213 = new Panel();

        public Button BB4 = new Button();
        Label F4 = new Label();
        Label K4 = new Label();
        Panel P14 = new Panel();
        Panel P214 = new Panel();

        public Button BB5 = new Button();
        Label F5 = new Label();
        Label K5 = new Label();
        Panel P15 = new Panel();
        Panel P215 = new Panel();

        public Button BB6 = new Button();
        Label F6 = new Label();
        Label K6 = new Label();
        Panel P16 = new Panel();
        Panel P216 = new Panel();

        public Button BB7 = new Button();
        Label F7 = new Label();
        Label K7 = new Label();
        Panel P17 = new Panel();
        Panel P217 = new Panel();

        public Button BB8 = new Button();
        Label F8 = new Label();
        Label K8 = new Label();
        Panel P18 = new Panel();
        Panel P218 = new Panel();

        public Button BB9 = new Button();
        Label F9 = new Label();
        Label K9 = new Label();
        Panel P19 = new Panel();
        Panel P219 = new Panel();

        public Button BB10 = new Button();
        Label F10 = new Label();
        Label K10 = new Label();
        Panel P110 = new Panel();
        Panel P2110 = new Panel();

Die Methode wird aufgerufen und das 2 Panel wird deklariert etc. Wenn ich nun die Methode aufrufe
wird entweder die Form geöffnet und das erste Panel mit denn Controls angezeigt oder wenn es bereits offen ist wird das erste gelöscht und das 2 Panel wird angezeigt.

Es funktioniert alles wie es soll jedoch ist es sehr umständlich möglicherweise hat noch jemand eine andere Idee?


 //Vorhandenes programm öffnen
        public void ProgrammÖffnen(string Programmname)
        {
            //Panel zum Anzeigen der Funktionen 2.0 alsod as wird immer neugeladen
            p1.BackColor = System.Drawing.Color.Beige;
            p1.Location = new System.Drawing.Point(0, 0);
            p1.Name = "pane23l2";
            p1.AutoScroll = true;
            p1.Size = new System.Drawing.Size(1055, 590);
            p1.TabIndex = 196;

            try
            {
                Programm p = new Programm();
                ProgrammAufrufFunktionsButtonGrundOberfläche pafbo = new ProgrammAufrufFunktionsButtonGrundOberfläche();

                Form currentForm = Application.OpenForms["Programm"];


                //wie viele funktionen aus Datenbank auslesen
                string FunktionsAnzahl = MYSQL.MYSQLProgramm.ProgrammFunktionanzahlAuslesen(Programmname);
                int FunktionsAnzahlINT = int.Parse(FunktionsAnzahl);
                FunktionsAnzahlINT++;

                for (int i = 1; i <= FunktionsAnzahlINT; i++)
                {

                    List<Panel> test = new List<Panel>();
                    test = myCollection.ToList();

                    string funktionsname = MYSQL.MYSQLProgramm.FunktionsNameAbfragen(i, Programmname);
                    int ParamaterNummer = ParameterNummerherausfinden(funktionsname);
                    string kommentar = MYSQL.MYSQLProgramm.ProgrammEinzelnerParameterAuslesen(Programmname, i, ParamaterNummer);

                    if (i == FunktionsAnzahlINT)
                    {

                        if (currentForm == null)
                        {
                            p.ShowDialog();
                        }
                        else
                        {


                            foreach (var inhalt in test)
                            {

                             
                                inhalt.Controls.Clear();
                                inhalt.Controls.Add(p1);
                                inhalt.Visible = true;
                                inhalt.BringToFront();
                                inhalt.Show();

                            }

                        }
                    }
                    else
                    {
                        switch (i)
                        {

                            case 0:

                                MessageBox.Show("Error!");


                                break;
                            case 1:



                                B1 = pafbo.Button(BB1, F1, K1, P11, P211);
                                B1.Text = i.ToString();
                                B1.Location = new System.Drawing.Point(5, 5);
                                B1.Name = "BB1";
                                F1.Text = funktionsname;
                                K1.Text = kommentar;
                                B1.Click += new System.EventHandler(p.B1_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B1);
                                }
                                else
                                {
                                    p1.Controls.Add(B1);

                                }

                                break;

                            case 2:

                                B2 = pafbo.Button(BB2, F2, K2, P12, P212);
                                B2.Text = i.ToString();
                                B2.Location = new System.Drawing.Point(5, 50);
                                B2.Name = "BB2";
                                F2.Text = funktionsname;
                                K2.Text = kommentar;
                                B2.Click += new System.EventHandler(p.B2_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B2);
                                }
                                else
                                {
                                    p1.Controls.Add(B2);

                                }


                                break;

                            case 3:

                                B3 = pafbo.Button(BB3, F3, K3, P13, P213);
                                B3.Text = i.ToString();
                                B3.Location = new System.Drawing.Point(5, 95);
                                B3.Name = "BB3";
                                F3.Text = funktionsname;
                                K3.Text = kommentar;
                                B3.Click += new System.EventHandler(p.B3_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B3);
                                }
                                else
                                {
                                    p1.Controls.Add(B3);

                                }

                                break;

                            case 4:

                                B4 = pafbo.Button(BB4, F4, K4, P14, P214);
                                B4.Text = i.ToString();
                                B4.Location = new System.Drawing.Point(5, 140);
                                B4.Name = "BB4";
                                F4.Text = funktionsname;
                                K4.Text = kommentar;
                                B4.Click += new System.EventHandler(p.B4_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B4);
                                }
                                else
                                {
                                    p1.Controls.Add(B4);

                                }

                                break;

                            case 5:

                                B5 = pafbo.Button(BB5, F5, K5, P15, P215);
                                B5.Text = i.ToString();
                                B5.Location = new System.Drawing.Point(5, 185);
                                B5.Name = "BB5";
                                F5.Text = funktionsname;
                                K5.Text = kommentar;
                                B5.Click += new System.EventHandler(p.B5_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B5);
                                }
                                else
                                {
                                    p1.Controls.Add(B5);

                                }

                                break;

                            case 6:

                                B6 = pafbo.Button(BB6, F6, K6, P16, P216);
                                B6.Text = i.ToString();
                                B6.Location = new System.Drawing.Point(5, 230);
                                B6.Name = "BB6";
                                F6.Text = funktionsname;
                                K6.Text = kommentar;
                                B6.Click += new System.EventHandler(p.B6_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B6);
                                }
                                else
                                {
                                    p1.Controls.Add(B6);

                                }


                                break;

                            case 7:

                                B7 = pafbo.Button(BB7, F7, K7, P17, P217);
                                B7.Text = i.ToString();
                                B7.Location = new System.Drawing.Point(5, 275);
                                B7.Name = "BB7";
                                F7.Text = funktionsname;
                                K7.Text = kommentar;
                                B7.Click += new System.EventHandler(p.B7_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B7);
                                }
                                else
                                {
                                    p1.Controls.Add(B7);

                                }

                                break;

                            case 8:

                                B8 = pafbo.Button(BB8, F8, K8, P18, P218);
                                B8.Text = i.ToString();
                                B8.Location = new System.Drawing.Point(5, 320);
                                B8.Name = "BB8";
                                F8.Text = funktionsname;
                                K8.Text = kommentar;
                                B8.Click += new System.EventHandler(p.B8_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B8);
                                }
                                else
                                {
                                    p1.Controls.Add(B8);

                                }

                                break;


                            case 9:

                                B9 = pafbo.Button(BB9, F9, K9, P19, P219);
                                B9.Text = i.ToString();
                                B9.Location = new System.Drawing.Point(5, 365);
                                B9.Name = "BB9";
                                F9.Text = funktionsname;
                                K9.Text = kommentar;
                                B9.Click += new System.EventHandler(p.B9_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B9);
                                }
                                else
                                {
                                    p1.Controls.Add(B9);

                                }
                                break;

                            case 10:

                                B10 = pafbo.Button(BB10, F10, K10, P110, P2110);
                                B10.Text = i.ToString();
                                B10.Location = new System.Drawing.Point(5, 410);
                                B10.Name = "BB10";
                                F10.Text = funktionsname;
                                K10.Text = kommentar;
                                B10.Click += new System.EventHandler(p.B10_Click);

                                if (currentForm == null)
                                {
                                    p.p.Controls.Add(B10);
                                }
                                else
                                {
                                    p1.Controls.Add(B10);

                                }


                                break;

                            default:
                                break;

                        }
                    }
                }
            }

            catch
            {

            }
        }

16.841 Beiträge seit 2008
vor 5 Jahren
  1. Deutscher Code ist eklig und Umlaute im Quellcode ein NoGo!
  2. Verwendest Du in so einem Fall static ist das immer ein Hinweis auf ein Designfehler
  3. bitte verwende Variablenbezeichner, mit denen andere Personen (und Dein späteres Ich) auch was anfangen können ( [Artikel] C#: Richtlinien für die Namensvergabe )
  4. Du mischt UI Code extrem mit der Logik; das knallt mit Ansage gegen die Wand; sehr großer Spaghetticode 😉 Das muss erstmal gerade gezogen werden, sodass Du wiederverwendbaren Code schreiben kannst...
X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren
  1. Mir ist bewusst das dieser Code absoluter Mühl ist er dient auch nur zum ausprobieren mehr nicht.

  2. Ich habe eigentlich fast keine Ahnung vom Programmieren da ich weder in der Schule noch sonst wo die Möglichkeit hatte es zu lernen. Ich versuche mir alles selber beizubringen da mir jedoch niemand über die Schulter schaut oder zeigt wie es geht ist das etwas Schwierig. Die Dokumentation etc sind ja tolle Hilfsmittel aber wie gesagt es fehlt trotzdem jemand der dann am Ende sagt das gehört so und so etc.

16.841 Beiträge seit 2008
vor 5 Jahren

Mir ist bewusst das dieser Code absoluter Mühl ist er dient auch nur zum ausprobieren mehr nicht.

Wenn Du mit diesem Ansatz vorgehst, wirst Du niemals guten Code schreiben.
Nicht ist so beständig, wie temporärer Code. Also immer sofort angewöhnen egal in welcher Situation guten Code zu schreiben.

Ich versuche mir alles selber beizubringen da mir jedoch niemand über die Schulter schaut oder zeigt wie es geht ist das etwas Schwierig. Die Dokumentation etc sind ja tolle Hilfsmittel aber wie gesagt es fehlt trotzdem jemand der dann am Ende sagt das gehört so und so etc.

Es gibt halt nicht nur einen Weg nach Rom 😉
Aber dass Dir jetzt jemand den Code in seiner Freizeit refaktoriert; da musst schon Glück haben, dass dafür jemand Zeit (und Lust) hat.

Letzten Endes ist Software Entwicklung eigentlich ein super Feld für das autodidaktische Vorgehen.
Tipps bekommst Du hier ja reichlich.

X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren

Wenn Du mit diesem Ansatz vorgehst, wirst Du niemals guten Code schreiben.
Nicht ist so beständig, wie temporärer Code. Also immer sofort angewöhnen egal in welcher Situation guten Code zu schreiben.

Werd ich mir merken! 😁

Es gibt halt nicht nur einen Weg nach Rom 😉
Aber dass Dir jetzt jemand den Code in seiner Freizeit refaktoriert; da musst schon Glück haben, dass dafür jemand Zeit (und Lust) hat.
Letzten Endes ist Software Entwicklung eigentlich ein super Feld für das autodidaktische Vorgehen.
Tipps bekommst Du hier ja reichlich.

Wo du recht hast hast du recht und da wir gerade eh dabei sind hätte ich noch eine Frage zu meinem Code. Wie dir sicherlich aufgefallen ist erstelle ich Buttons von B1 bis B10 mit jeweiligen Controls etc. Das Problem ist das es durchaus möglich ist das ich auf meinem Panel bis zu 100 Buttons benötige nun die Frage kann man diese dann generieren lassen also immer genau so viele wie auch benötigt werden? 🤔

4.941 Beiträge seit 2008
vor 5 Jahren

Dafür gibt es die Datenstrukturen Array (konstante Anzahl) und List<T> (variable Anzahl).

Du solltest auf jeden Fall die Grundlagen anhand eines Buchs durchgehen, s. [FAQ] Wie finde ich den Einstieg in C#?.

M
368 Beiträge seit 2006
vor 5 Jahren

kann man diese dann generieren lassen also immer genau so viele wie auch benötigt werden? Neben der Doku beachte man die FAQ, z.B.: FAQ Controls zur Laufzeit

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren

Dafür gibt es die Datenstrukturen
>
(konstante Anzahl) und
>
(variable Anzahl).

Diese Datenstrukturen sind mir bekannt jedoch habe ich bisher noch nicht herausgefunden wie ich mit diesen Effektiv das Problem lösen kann.

Du solltest auf jeden Fall die Grundlagen anhand eines Buchs durchgehen, s.
>
.

Vielen Dank für denn Link. 😁

X
xp21xp Themenstarter:in
22 Beiträge seit 2018
vor 5 Jahren

Vielen Danke genau das habe ich gesucht 👍