Autor Beitrag
Dr_Shiwago
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 14:57 
Hallo
weiß nicht genau ob der titel passt, wusste aber nicht welches thema ich meine Problem widmen sollte.
Nun zu meinem Problem. Ich bin ziemlich neu auf dem gebiet muss aber ein für mich schwieriges projekt erstellen. dazu habe ich folgende frage:

Ich habe eine sich ständig veränderte Form mit anfänglich 6 buttons die vom Benutzer durch den button neu erweitert werden und über einen löschen button gelöscht werden können. Nun habe ich mir überlegt ein Array mit den ganzen Buttons zu erstellen. Die buttons sollen alle die gleichen Größe haben und jeweils drei buttons in einer spalte. Wie mach ich das jetzt das bei einem neuem button automatisch ein Button, falls bereits drei buttons sich in einer spalte befinden, in der nächsten spalte erzeugt wird und wenn ich einen lösche das sich die anderen Buttons neu anordnen. Außerdem sollen sich alle Buttons der Form anpasssen. Das heißt wenn ich die form vergrößere sollen sich die buttons auch proportional vergrößern.

Ich hoffe ihr könnt mir da weiterhelfen. Bitte nur in C#.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 15:13 
Hallo und :welcome:,

ist genau das deine Aufgabe? oder denkst du nur die Problemstellung so zu lösen?

Ich habe auch beim dritten mal durchlesen es nicht zu 100% verstanden. Generell gilt, wenn du ein sich in der Anzahl veränderbare Struktur hast nimm keine Arrays sondern eine Liste. Damit sich die Buttons an der Größe der Form anpassen musst du nur die Anchor Eigenschaft entsprechend setzen.

Was du mit Spalten meinst verstehe ich nicht... meinst du so sollen die Buttons angeordnet werden? oder hat es irgend einen tieferen sinn? Welchen Sinn hat es überhaupt dynamische Buttons zu erzeugen?

Ich denke an dieser Stelle das wir, wenn wir dir helfen sollen, mehr Input brauchen. Auch ein Fragezeichen (so dass man die Frage gleich erkennt) ist sehr hilfreich.

Gruß Daniel
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 15:47 
Ne das ist nur ein Teil meiner Aufgaben. Mein Projekt ist das Inhaltsmanagement eines Gefrierschrankes. Um es genauer zu erklären. Ich habe auf meiner Form bereits 6 Buttons ( diese Buttons stehen für Hauptkategorie z.B für fleisch, fisch usw). Wenn ich jetzt auf den Button fleisch klicke komme ich auf auf die Unterkategorie wo z.B Rindfleisch,SChweinefleisch usw steht. Es geht mir aber jetzt um die Hauptkategorie mit den 6 Buttons. Desweiteren habe ich zwei Buttons einmal mit Neu, um ein neuen Button zu erzeugen und Löschen um ein Button zu löschen. Wenn ein Benutzer jetzt neu anklickt soll ein neuer button generiert werden und zur form hinzugefügt werden. Da meine form nur ne bestimmt größe haben sollen und nur 3 Buttons in eine reihe passen soll er den neuen Button also in die nächste zeile schreiben und so weiter.Und wenn ich nen Button lösche soll er die automatisch anordnen.
Einloggen, um Attachments anzusehen!
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 16:16 
Ah nun verstehe ich es. Du hast den Thread in C# eröffnet.

Heißt das für Lösung ist es egal es in WinForms oder WPF ist?

Denke in Wpf kann man das super schön lösen :D
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 16:26 
darauf hab ich mich jetzt noch nicht festgeleget. also erstmal egal. irgendwelche tipps wie ich es lösen könnte?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 16:38 
Für WinForms musst du das Form, wie du es jetzt schon hast, wohl mit einem TableLayoutPanel machen. Das hinzufügen, bzw. entfernen von Knöpfen kann halt dazu führen, dass du eine Zeile hinzu bzw. entfernen musst und dementsprechend die Höhe der einzelnen Zeilen anpassen.

In WPF könntest du einfach mit Stackpanels die Buttons hinzufügen und bei jeden dritten ein neues Stackpanel machen.

So mal mein erster Ansatz ...

Gruß Daniel
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 16:56 
Ich hab das ja im moment mit einem TableLayoutPanel gemacht. Das Problem ist aber das das automatisch laufen soll. Also wenn der benutzer einen neuen button anlegt soll der auch gleich den anderen buttons angepasst werden. Und wie soll ich diese buttons dann im TableLayout anordnen. Ich weiß ja z.B auch nicht wie viele Buttons am ende erstellt werden,weil der benutzer ja soviele buttons erstellen kann wie er möchte.Das soll alles eig. über den code laufen. Mit wpf habe ich noch nichts gemacht, deswegen weiß ich nicht wie diese stackpanels funktionieren.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 17:01 
Schau dir an, wie der Designer Tabellenspalten hinzufügt. Diesen Code kannst du "kopieren" und musst den dann entsprechend beim "Neue Kategorie hinzufügen" ausführen lassen.
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 17:09 
da steht überhaupt kein code zu
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 17:14 
ah doch hab ihn gefunden den code
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 17:16 
Du musst in der <FormName>.Designer.cs Datei schauen.

Dort gibt es eine Region "Vom Windows Form-Designer generierter Code".

Wenn ich ein TableLayoutPanel1 drauf ziehe und ein paar Spalten und Zeilen hinzufüge sieht das dann zirka so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)))
this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)))


Und wenn ich nun einen Button in die erste Zeile in die zweite Spalte mache erzeugt er mir noch folgenden Code:

ausblenden C#-Quelltext
1:
   this.tableLayoutPanel1.Controls.Add(this.button1, 10);					


Sowas bräuchtest du halt auch :)

Und denk dran, wenn du eine neue Spalte hinzufügen willst... ColumnCount erhöhen und ColumnStyles.Add ....

Bringt dir das was?
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 17:23 
Meine Form hast du ja vorhin gesehen
Unter dem Button steht folgender Code:

// btnFleisch
//
this.btnFleisch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.btnFleisch.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnFleisch.Location = new System.Drawing.Point(3, 3);
this.btnFleisch.Name = "btnFleisch";
this.btnFleisch.Size = new System.Drawing.Size(124, 36);
this.btnFleisch.TabIndex = 0;
this.btnFleisch.Text = "Fleisch";
this.btnFleisch.UseVisualStyleBackColor = true;

Aber ich habe ihm ja feste werte zugewiesen, aber wie schreib ich den in dem code für den neuen button dann wo der ihn hin machen soll.

Beim tableLayoutPanel muss ich ihm ja auch noch sagen er soll ne neue zeile hinzufügen. Nur wie mach ich das mit den werten was sag ich ihm?
tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 3;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.tableLayoutPanel2.Controls.Add(this.btnGeflügel, 2, 0);
this.tableLayoutPanel2.Controls.Add(this.btnFisch, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnFleisch, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.btnKartoffelg, 2, 4);
this.tableLayoutPanel2.Controls.Add(this.btnObst, 1, 4);
this.tableLayoutPanel2.Controls.Add(this.btnGemüse, 0, 4);
this.tableLayoutPanel2.Controls.Add(this.btnPizza, 0, 2);
this.tableLayoutPanel2.Controls.Add(this.btnFertiggericht, 1, 2);
this.tableLayoutPanel2.Controls.Add(this.btnBackwaren, 2, 2);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 52);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 13;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 6F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(391, 330);
this.tableLayoutPanel2.TabIndex = 2;
this.tableLayoutPanel2.Paint += new System.Windows.Forms.PaintEventHandler(this.tableLayoutPanel2_Paint);
//
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 04.02.10 17:43 
Also konkret.

Nimm ein leere TableLayoutPanel.
Füge drei Spalten hinzu (breite 33%)

Beim Neue Kategorie Click Event schreibst du in etwa dann:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// Create categoryButton
Button newCategoryButton = CreateCategoryButton("Fleisch");

// add to reference list
this.CategoryButtons.Add(newCategoryButton);

// check table size
if (this.CategoryButtons.Counter / 3 > this.tablePanelLayout1.Rows)
{
  // add row
  this.tablePanelLayout1.RowCount++;
  this.tableLayoutPanel1.RowsStyles.Add(new RowStyle());
}

// add to table
this.tablePanelLayout1.Controls.Add(newCategoryButton, this.CategoryButtons.Count % Spalten, this.CategoryButtons.Count / Spalten);



ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private Button CreateCategoryButton(string categoryName)
{
   Button b = new Button();
   
b.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); 
   b.Text = categoryName;
   return b;
}



Das ist mal ein Ansatz (frei gecoded... muss man wohl anpssen !). Kannst ja schauen ob du was drauß machen kannst.. ich fahre erstmal heim ;)

Lata
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 04.02.10 17:48 
Das sieht schon mal nach was aus. ich danke dir erstmal. werde mich gleihc weiter reinarbeiten und mal schauen ob ich dann noch hilfe brauche. aber bis hier hin danke für deine hilfe
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 05.02.10 11:44 
danke erstmal für die hilfe gestern.
habe nun ein neues problem.

unzwar wie speicher ich die vom benutzer erstellten buttons ab. also wenn ich in ne andere form gehe und wieder zurück sind die neu erstellten buttons ja weg. wie krieg ich das jetzt hin das diese abgepeichert werden. wenn möglich automatisch ohne das der benutzer noch abspeichern muss
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 05.02.10 12:12 
In Wirklichkeit interessieren dich ja die Buttons nicht... die sind ja nur dazu da, dass der Anwender Elemente in Kategorien ordnen kann und in diese navigieren kann.

Merk dir einfach in einer Liste die verschiedenen Hauptkategorieren und übergib diese. Die Allgemeine Datenstruktur kenne ich nicht. Deshalb wäre eine andere Lösung vlt. angebrachter. Angenommen es geht rein um die Zuordnung (Ein Lebensmittel könnte in verschiedenen Kategorieren sein, usw.. ) dann wäre eine andere Struktur angebrachter.

Gruß Daniel
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 05.02.10 12:17 
Meinst du die Idee mit den Buttons komplett raus lassen und es z.B über ne listbox machen?
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 05.02.10 12:23 
Das Problem ist das Buttons für den Benutzer schöner sind. KAnnst dir ja wenn du möchtest dir die beispiel Präsentation anschauen. Haben wir mit Powerpoint gefertigt.Müsste die halt nur über email schicken. So in etwa solll das Programm ablaufen und die Oberflächen ausschauen.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 05.02.10 12:33 
Nein, das meine ich nicht. Ich meine das du die "Daten" von dem "View" trennen sollst. Sprich du sollst dich nicht auf einen Button oder eine Listbox festlegen, sondern eine Daten-Struktur definieren die sinnvoll ist (wenn diese noch nicht festgelegt ist).

Also Daten:

Lebensmittel Kategorien Gewicht ABlaufdatum
Tomate 1 100g 8.02.2010
Hackfleisch 2 250g 10.02.2010
Putenbrust 2 500g 13.02.2010
Lachs 3 200g 7.02.2010

Kateogrie Name
1 Gemüse
2 Fleisch
3 Fisch

....

Anzeige:

Alle Kateogrien aus der Kategorie/name Daten...
Und bei Auswahl einer Kategorie den entsprechenden Inhalt.

Und wenn du dann eine Kategorie hinzufügst machst du das dann bei den Daten und aktualisierst nur die Ansicht.
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 05.02.10 14:30 
Sorry musste weg. Ja an ne Datenstruktur haben wir auch schon gedacht. Nur wenn der benutzer jetzt eine neue Hauptkategorie anlegt muss dann ja auch automatisch ein neuer button angelegt werden oder versteh ich das falsch?