Benutzer mit den meisten Antworten
Mit Button Element erstellen - Anfängerfrage

Frage
-
Hallo Leute,
gleich vorweg, ich bin ein Anfänger mit C# deshalb brauch ich bitte eure Hilfe.
Und zwar möchte ich folgendes schaffen:
Ich habe in meinem Programm folgende GroupBox: http://img5.fotos-hochladen.net/uploads/boxjfz4l6pyie.jpg
Wie kann ich es so lösen, dass ich mit einem "+" Button solch eine Groupbox hinzufügen oder mit "-" entfernen kann?
Dh. brauche ich zb. 3 solche Boxen, klicke ich einfach 3x auf "+". In jeder Box ist dann ein "-" um sie wieder zu entfernen.
Später dann möchte ich auch die Position der Boxen per Drag&Drop verschieben können … zb. die letzte an erster Position.
Vielen Dank und Liebe Grüße,
Daniel!
Antworten
-
Hallo,
dein Vorhaben kann für neinen Anfäünger ziehmlich komplex werden, da es sehr viele Teiltehmen enthält, die du alle ganz gut dafür beherschen musst.Ich habe mal ein Beispiel erstellt, das erst einmal die Groupboxen hinzufügen und entfernen kann. In der Form habe ich dazu einen Button (buttonAdd) und ein Panel (panelBoxes) platziert. Beid em Panel habe ich die Anchors-Eigenschaft auf Top, Bottom, Left und Right gestellt sowie die AutoScroll-Eigenschaft auf true. Dadurch wird das Panel seine Größe an der Form anpassen und ggf. eine Scrollleiste anzeigen.
int counter = 0; private void buttonAdd_Click(object sender, EventArgs e) { GroupBox gb = new GroupBox();//GroupBox erstellen gb.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;//Automatisch horizonbtal strecken, falls notwendig gb.Top = panelBoxes.Controls.Count * 120;//Unter die vorherigen GroupBoxen schieben gb.Height = 110; gb.Width = panelBoxes.Width - 10;//Fast so breit wie das Panel gb.Left = 5;//5 abstand zum rechten Rand gb.Text = "Neue GroupBox Nr. " + ++counter;//Titel panelBoxes.Controls.Add(gb);//Control zum Panel hinzufügen Button btn = new Button();//Button zum löschen einer GB btn.Text = "Entfernen"; btn.Left = 5;//Etwas abstand zum Rand btn.Top = 20; gb.Controls.Add(btn);//Control zur GB hinzufügen btn.Click += btn_Click;//Click-Event abonnieren panelBoxes.Invalidate(); } void btn_Click(object sender, EventArgs e) { var gb = (sender as Button).Parent;//Der Button liegt in der GB, somit ist GB das Parent des Buttons bool flag = false; for (int i = 0; i < panelBoxes.Controls.Count; ++i) { if (flag) { panelBoxes.Controls[i].Top -= 120;//GroupBoxen nach der gelöschten um 1 Position nach oben schieben } else if (panelBoxes.Controls[i] == gb) { flag = true; //GroupBox gefunden panelBoxes.Controls.Remove(gb);//GroupBox entfernen --i;//Nächstes Control nicht überspringen } } }
Ich habe den Code weitestgehend kommentiert. Er sollte also soweit verständlich sein.
Was das verschieben betrifft wird es schwieriger. Hier solltest du die Mouse*-Events der GroupBox abonnieren und in MouseMove auf die Bewegung reagieren und entsprechend die Positionen neu setzen.
Wenn es nur um ein Hoch-Runter in der Liste geht, kannst du das auch mit 2 Buttons in jeder GroupBox realisieren. Das sollte einfacher sein als ein drag'n'drop-System.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Sonntag, 24. August 2014 21:47
- Als Antwort markiert UPX33 Samstag, 30. August 2014 17:16
Alle Antworten
-
Hallo,
dein Vorhaben kann für neinen Anfäünger ziehmlich komplex werden, da es sehr viele Teiltehmen enthält, die du alle ganz gut dafür beherschen musst.Ich habe mal ein Beispiel erstellt, das erst einmal die Groupboxen hinzufügen und entfernen kann. In der Form habe ich dazu einen Button (buttonAdd) und ein Panel (panelBoxes) platziert. Beid em Panel habe ich die Anchors-Eigenschaft auf Top, Bottom, Left und Right gestellt sowie die AutoScroll-Eigenschaft auf true. Dadurch wird das Panel seine Größe an der Form anpassen und ggf. eine Scrollleiste anzeigen.
int counter = 0; private void buttonAdd_Click(object sender, EventArgs e) { GroupBox gb = new GroupBox();//GroupBox erstellen gb.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;//Automatisch horizonbtal strecken, falls notwendig gb.Top = panelBoxes.Controls.Count * 120;//Unter die vorherigen GroupBoxen schieben gb.Height = 110; gb.Width = panelBoxes.Width - 10;//Fast so breit wie das Panel gb.Left = 5;//5 abstand zum rechten Rand gb.Text = "Neue GroupBox Nr. " + ++counter;//Titel panelBoxes.Controls.Add(gb);//Control zum Panel hinzufügen Button btn = new Button();//Button zum löschen einer GB btn.Text = "Entfernen"; btn.Left = 5;//Etwas abstand zum Rand btn.Top = 20; gb.Controls.Add(btn);//Control zur GB hinzufügen btn.Click += btn_Click;//Click-Event abonnieren panelBoxes.Invalidate(); } void btn_Click(object sender, EventArgs e) { var gb = (sender as Button).Parent;//Der Button liegt in der GB, somit ist GB das Parent des Buttons bool flag = false; for (int i = 0; i < panelBoxes.Controls.Count; ++i) { if (flag) { panelBoxes.Controls[i].Top -= 120;//GroupBoxen nach der gelöschten um 1 Position nach oben schieben } else if (panelBoxes.Controls[i] == gb) { flag = true; //GroupBox gefunden panelBoxes.Controls.Remove(gb);//GroupBox entfernen --i;//Nächstes Control nicht überspringen } } }
Ich habe den Code weitestgehend kommentiert. Er sollte also soweit verständlich sein.
Was das verschieben betrifft wird es schwieriger. Hier solltest du die Mouse*-Events der GroupBox abonnieren und in MouseMove auf die Bewegung reagieren und entsprechend die Positionen neu setzen.
Wenn es nur um ein Hoch-Runter in der Liste geht, kannst du das auch mit 2 Buttons in jeder GroupBox realisieren. Das sollte einfacher sein als ein drag'n'drop-System.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Sonntag, 24. August 2014 21:47
- Als Antwort markiert UPX33 Samstag, 30. August 2014 17:16
-
Vielen Vielen Dank für deine Hilfe!
Es hat beim umsetzen alles geklappt und ich konnte mich auch ein wenig in die Teilthemen einlesen.
Nun stehe ich aber schon vor dem nächsten Problem: Und zwar hab ich in den GroupBoxen auch 1 Textfeld und einen Button (zusätzlich zu dem GB löschen Button). Wie ist es nun möglich, dass jedes GB Textfeld und jeder Button extra angesprochen werden kann? Kann ich das irgendwie mit einer fortlaufenden Nummer lösen?
Vielen Dank! :)
-
Über eine Nummer könnte es zwar gehen, das halte ich aber nicht für sehr effektiv.
Ich würde es wie folgt lösen:Die Controls müssten zusammen mit dem Löschen-Button erstellt werden:
Button btn2=new Button(); //btn2 zuweisen... btn2.Tag = "MyButton2";//Innerhalb der GroupBox muss das eindeutig sein gb.Controls.Add(btn2); //gleiches für die TextBox
Wenn du nun innerhalb eines Eventhandlers vom Button oder der TextBox an die Controls heran willst, kannst du wieder über die Parent-Eigenschaft gehen.
void btn2_Click(object sender, EventArgs e) { var gb = (sender as Button).Parent as GroupBox;
Für die TextBox musst du sender antürlich in eine TextBox wandeln. Wenn du außerhalb eines solchen Eventhandlers an eine GroupBox willst, musst du über den Index im Panel an die GroupBox gelangen:
var gb = panelBoxes.Controls[index] as GroupBox;
Nun kannst du die GroupBox nach der TextBox bzw. dem Button durchsuchen:
static T FindControl<T>(GroupBox gb, string tagName) where T : Control { foreach (Tctrl in gb.Controls.OfType<T>()) if (ctrl.Tag.ToString() == tagName) return (T)ctrl; throw new ArgumentException("tagName"); }
So könntest du mit der Methode an den Button kommen:
var tb = FindControl<TextBox>(gb, "MyTextBox2");
Die FindControl-Methode ist vielleicht etwas kompliziert für einen Anfänger, darum eine kurze Erklärung dazu. Die Methode gibt einen Typ zurück, dieser wird einfach T genannt. Dieser hat die EInschränkung, das er von Control abgeleitet sein muss. Wenn wir also <TextBox> beim Ausruf angeben, wird auch eine TextBox zurück gegeben.
Die OfType<T>()-Methode sucht nun wiederum nur Controls heraus, die auch vom Typ T sind. Die gefundenen Controls werden alle durchlaufen. Sollte ein Control als Tag-Eigenschaft den Wert des tagName-Parameters haben, wird das Control zurück gegeben.
Sollte kein Control mit dem richtigen Wert in der Tag-Eigenschaft gefunden werden, wird eine Ausnahme ausgelöst.Deine 2. Frage ist an sich genauso komplex wie die ursprünglichen. Vielleicht wäre es daher besser Fragen zum 2. Problem in einen neuen Thread zu packen und diesen als Beantwortet zu markieren. So bleibt hier die Übersicht trotz der komplexen Frage gewahrt.
(Du kannst im neuen Thread gerne auf diese Frage verlinken.)Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets