Zum Inhalt springen

TabControl mit dynamischen Controls erstellen


Empfohlene Beiträge

Geschrieben

Hallo Leute,

ich habe folgendes Problem, ich arbeite an einem Programm, welches zur Verwaltung von Personen dient. Damit ich nicht immer wieder neue Fenster öffnen muss, möchte ich, dass Funktionen wie "Person editieren" und so in einem TabControl auf meiner Hauptform geöffnet wird.

Also wenn man eine Funktion anklickt soll ein neuer Tab hinzugefügt werden der bestimmte Controls enthält. Es ist aber darauf zu achten, das "Person editieren" natürlich ganz andere Controls hat als "Zeige mir alle Personen".

Ich habe es so versucht:


private void Build_Hed()

        {

            // 

            // TB_Bemerkung

            // 

            TextBox TB_Bemerkung = new System.Windows.Forms.TextBox();

            TB_Bemerkung.Location = new System.Drawing.Point(10, 252);

            TB_Bemerkung.Multiline = true;

            TB_Bemerkung.Name = "TB_Bemerkung";

            TB_Bemerkung.Size = new System.Drawing.Size(440, 117);

            TB_Bemerkung.TabIndex = 27;

            // 

            // label12

            // 

            Label label12  = new System.Windows.Forms.Label();

            label12.AutoSize = true;

            label12.Location = new System.Drawing.Point(7, 236);

            label12.Name = "label12";

            label12.Size = new System.Drawing.Size(94, 13);

            label12.TabIndex = 26;

            label12.Text = "Bemerkung (300): ";

            // 

            // label11

            // 

            Label label11 = new System.Windows.Forms.Label();

            label11.AutoSize = true;

            label11.Location = new System.Drawing.Point(7, 201);

            label11.Name = "label11";

            label11.Size = new System.Drawing.Size(64, 13);

            label11.TabIndex = 25;

            label11.Text = "Geb. Datum";


            .....etc...


            // 

            // Zur TabPage adden

            //

            tabPage1.Controls.Add(TB_Bemerkung);

            tabPage1.Controls.Add(label12);

            tabPage1.Controls.Add(label11);

        }

Soweit klappt es auch, nur daran ist nichts dynamisch -.- Ich möchte ja ein neuen Tab öffnen und die oben genannten Controls in den neuen Tab schreiben, aber wenn ich das versuchen geht es nicht, da beim Compilieren dieser Tab noch nichts existiert. Das folgende geht also nicht da "Person_edit" ja noch garnihct existiert.

            // 

            // Zur TabPage adden

            //

            tabControl1.TabPages.Add("Personen_edit");

            Personen_edit.Controls.Add(TB_Bemerkung);

            Personen_edit.Controls.Add(label12);

            Personen_edit.Controls.Add(label11);

Ich hoffe ich konnte mich klar genug ausdrücken und hoffe das mir jemand helfen kann.

Schönen Abend noch...

greetz Swonson

Geschrieben

Hi,

du kannst es wie folgt machen.


        private void AddTapDynamicToTabControl1() {

            System.Windows.Forms.TabPage npage = new TabPage();

            npage.Text = "new page";

            //andere Controls der Tappage adden

            Button btn1 = new Button();

            btn1.Location = new Point(10, 10);

            btn1.Text = "button1";

            npage.Controls.Add(btn1);

            //Page dem jeweiligen TabControl hinzufügen

            tabControl1.TabPages.Add(npage);


        }

lg

Gateway

Geschrieben (bearbeitet)

Hi

eine andere Möglichkeit wäre, wenn du dir für JEDES Tabpane ein Steuerelement schreibst, dann hättest den Vorteil, dass du beim Erstellen des Steuerelements die anderen Elemente (wie Textfelder) "draufziehen" kannst.

Anschließend kannst das neue Steuerelement einfach deiner TabControl hinzufügen. Der nächste Vorteil ist auch, dass du das Steuerelement unter Umständen öfter verwenden kannst.

Gruß Hans-Jörg

Bearbeitet von HJST1979
Geschrieben

Super Gateway_man, das klappt schon mal sehr gut.

Nun frage ich mich, wie kann ich dem Button den ich eben auf den Tab gebastelt habe, eine Funktion zuweisen? Gleiches Problem, das der Button nicht existiert kommt natürlich ein Fehler.

Danke für die Antwort Hans-Jörg, wie könnte das denn aussehen?

greetz Swonson

Geschrieben (bearbeitet)

        private void AddTapDynamicToTabControl1()

        {

            System.Windows.Forms.TabPage npage = new TabPage();

            npage.Text = "new page";

            //andere Controls der Tappage adden

            Button btn1 = new Button();

            btn1.Location = new Point(10, 10);

            btn1.Text = "button1";

            //du must das entsprechende Event registrieren (sprich einer Funktion zuweisen).

            btn1.Click += new EventHandler(btn1_Click);

            npage.Controls.Add(btn1);

            //Page dem jeweiligen TabControl hinzufügen

            tabControl1.TabPages.Add(npage);


        }

        private void btn1_Click(object sender, EventArgs e) { 

        //hier der code für button click event

            Button curr = (Button)sender;

            MessageBox.Show("button=" + curr.Text);

        }

Bearbeitet von Gateway_man
Geschrieben

Hallo,

entschuldigt bitte, dass ich diese Thread wieder nutzen muss.

Ich habe eigentlich ein ähnliches Problem wie vorher. Ich hab es die ganze Nacht versucht selber zu lösen, habe es aber leider nicht hinbekommen...

Ich möchte bei Knopfdruck meine Ausgefüllten Textboxen in eine DB schreiben, aber wieder das gleiche Problem, sie existieren ja nicht. Ich hab rum probiert aber es geht irgendwie nicht...

mein DB code sieht so aus:


            string dataSource = "db.db";


            SQLiteConnection connection = new SQLiteConnection();

            connection.ConnectionString = "Data Source=" + dataSource;

            connection.Open();


            SQLiteCommand command = new SQLiteCommand(connection);


            //Einfügen eines Test-Datensatzes.

            command.CommandText = "INSERT INTO TB_Halter (Nachname, Vorname, Titel)

VALUES ('" + textBox1.Text + "', '" + textBox2.Text + "', '" + textBox3.Text + "')";

            command.ExecuteNonQuery();


            //Freigave der Ressourcen.

            command.Dispose();

            connection.Close();

            connection.Dispose();


            MessageBox.Show("Erfolgreich!");

            this.Close();

Der Code zum einfügen geht einwandfrei... der einzige Fehler ist, das die Textboxen ja garnicht existent sind....

(bitte ignoriert Syntaxfehler im InsertCode, kann sein das sie durchs kürzen hängen geblieben sind...)

Ich hoffe mir kann jemand helfen :(

Danke im voraus und bis späder.

greetz swonson

Geschrieben

Hi,

nur mal ein gut gemeinter Ratschlag. Das mit dem dynamischen erstellen würde ich erstmal nicht so machen, da du ja scheinbar noch nicht allzuviel Erfahrung gesammelt hast und es momentan doch sehr unsauber aussieht. Ich könnte dir zwar eine Lösung anbieten, allerdings halte ich diese selbst für extrem unsauber.

Warum machst du es nicht einfach so, das du für das anzeigen, bearbeiten,neuanlegen seperate masken im designer erstellst. Diese dann per Visible Property versteckst und zu rechten Zeit wieder sichtbar machst. Ich denke damit wärst du besser bedient.

Denn wenn du es dynamisch machen willst dann würde ich dir auch das schreiben einer Steuerung wie von HJST1979 vorgeschlagen empfehlen.

Aber ich werd jetzt schnell eine Lösung zeigen, die ich wie gesagt selbst nicht so super finde das es eben jedesmal auf neue einen gewissen Rechenaufwand benötigt.

Vorraussetzung hierfür ist, das du den Code generierten Controls einen namen zugewiesen hast.


private void SQLExecute(){

           //textboxes local erfassen

           TextBox textbox1 = (TextBox)this.Controls["textbox1"];

           TextBox textbox2 = (TextBox)this.Controls["textbox2"];

           TextBox textbox3 = (TextBox)this.Controls["textbox3"];

           //this.Controls[ControlName hier als string übergeben"]

           //statt this.Controls must du unter umständen den namen des Containers, wecher 

           //die Textboxen beinhaltet schreiben. Zum Beispiel Tabpage1.Controls (wenn die

           //Tabpage1 die Textboxen beinhaltet)

            string dataSource = "db.db";


            SQLiteConnection connection = new SQLiteConnection();

            connection.ConnectionString = "Data Source=" + dataSource;

            connection.Open();


            SQLiteCommand command = new SQLiteCommand(connection);


            //Einfügen eines Test-Datensatzes.

            command.CommandText = "INSERT INTO TB_Halter (Nachname, Vorname, Titel)

VALUES ('" + textbox1.Text + "', '" + textbox2.Text + "', '" + textbox3.Text + "')";

            command.ExecuteNonQuery();


            //Freigave der Ressourcen.

            command.Dispose();

            connection.Close();

            connection.Dispose();


            MessageBox.Show("Erfolgreich!");

            this.Close();

}

lg

Gateway

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...