Autor |
Beitrag |
DennisXX
      
Beiträge: 133
|
Verfasst: Di 16.08.11 13:04
Hallo zusammen !
Ich habe mal eine Frage zu dem Designer in C Sharp bzw. im Visual Studio von Microsoft.
Sobald ich eine Benutzeroberfläche im Microsoft Visual Studio mithilfe von Drag & Drop Funktionen mit Leben fülle, erzeugt der Designer im Hintergrund für mich transparent den Code, der eigentlich für die Erzeugung und Gestaltung der Komponenten auf der Benutzeroberfläche verantwortlich ist.
Ich habe mal "gehört", dass man an diesem Code am besten gar nichts mehr abändern sollte, weil der Designer da angeblich sehr empfindlich sein soll. Ist das eigentlich wahr? Sollte ich gar nichts mehr an diesem Code abändern bzw. modifizieren?
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button();
this.button1.Location = new System.Drawing.Point(12, 158); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "Liste"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); } |
Wäre es hier im Designer eigentlich direkt möglich, diesen Code per Paste and Copy in eine separate Klasse auszulagern und den Code im Designer durch die entsprechende Klasseninstanzierung zu ersetzen? Also so bspw.:
Quelltext 1: 2: 3: 4: 5:
| private void InitializeComponent() { EigeneKlasse ownClass = new EigeneKlasse(); ownClass.generateGUI(); } |
Die eigene Klasse würde dann so aussehen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Class EigeneKlasse{
EigeneKlasse()
public void generateGUI(){
this.button1 = new System.Windows.Forms.Button();
this.button1.Location = new System.Drawing.Point(12, 158); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "Liste"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click);
} } |
"this" würde dann natürlich durch die Bezeichnung des aktuellen Formulares bzw. der Benutzeroberfläche ersetzt werden. Kann man so etwas machen bzw. ist es dann auch gängige Praxis?
Aber auch nochmal explizit die Nachfrae: Ist der Designer wirklich so empfindlich?
Grüße
Dennis
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 16.08.11 16:33
Hallo Dennis,
an dem Designer-Code solltest du KEINE Änderungen vornehmen.
Es steht ja auch explizit im Kommentar drin:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| #region Windows Form Designer generated code
|
Was du natürlich machen kannst, ist, den Code aus der Designer-Datei in eine eigene Klasse zu kopieren (und dann evtl. die Komponente direkt über die Designeroberfläche zu löschen).
Wenn es dir nur darum geht, die Komponenten auszulagern (so daß sie nicht mehr direkt in der Form enthalten sind), dann benutze dafür ein Benutzersteuerelement (auf englisch "User Control"). Dann kannst du einfach dieses UserControl (nach einmaligem Kompilieren taucht es dann in der ToolBox auf) auf deine Form ziehen.
|
|
DennisXX 
      
Beiträge: 133
|
Verfasst: Mi 17.08.11 10:11
Hallo !
Th69 hat folgendes geschrieben : | Was du natürlich machen kannst, ist, den Code aus der Designer-Datei in eine eigene Klasse zu kopieren (und dann evtl. die Komponente direkt über die Designeroberfläche zu löschen). |
Ach so du meinst also, erst die Benutzeroberfläche mittels Drag & Drop erstellen, dann den automatisch generierten Code erstellen, diesen dann kopieren und auslagern, dann die Benutzeroberfläche wieder leerräumen und dann mittels des kopierten Codes die Oberfläche wieder neu erstellen (also ohne Drag & Drop)? Ist das so korrekt?
Aber nochmal explizit die Nachfrage: Wie genau muss ich dann die Klasse/Klassen instanzieren, in die ich den Code ausgelagert habe? (Vor allem direkt im Designer oder wo genau)?
Th69 hat folgendes geschrieben : | Wenn es dir nur darum geht, die Komponenten auszulagern (so daß sie nicht mehr direkt in der Form enthalten sind), dann benutze dafür ein Benutzersteuerelement (auf englisch "User Control"). Dann kannst du einfach dieses UserControl (nach einmaligem Kompilieren taucht es dann in der ToolBox auf) auf deine Form ziehen. |
Das habe ich ehrlich gesagt noch nicht ganz verstanden. Also ich schiebe ein solches Control auf die Oberfläche und schiebe dann auf dieses Control (auch wieder mittels Drag & Drop) die einzelenen Objekte wie Button, Radiobuttons, Textfelder, etc.? Aber dann habe ich doch wieder keinen ausgelagerten Code in separaten Klassen oder?
Grüße
Dennis
|
|
stes
      
Beiträge: 36
Erhaltene Danke: 6
Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
|
Verfasst: Di 23.08.11 02:26
Hi Dennis,
so wie ich das jetzt verstanden habe möchtest du die Entwicklung der GUI nicht "im Hintergrund" per Designer geschehen lassen, sondern in einer eigenen Klasse, soweit richtig? ^^
Natürlich ist das ohne Probleme möglich, bei simplen Anwendungen kannst du das ganze auch direkt in der Form-Klasse machen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| namespace FormSample { public class Form1 : Form { public Form1() { this.InitComponents(); }
public void InitComponents() { this.Text = "Sample Form";
Button b = new Button(); b.SetBounds(10, 10, 100, 20); b.Text = "Test Button"; this.Controls.Add(b);
Label l = new Label(); l.SetBounds(10, 50, 100, 20); l.Text = "Test Label"; this.Controls.Add(l); } } } |
Wenn du die Methode zum Initialisieren in eine andere Klasse umlagern willst, würde ich es an deiner Stelle per partial-Schlüsselwort machen (auch wenn es dann keine "andere" Klasse, sondern höchstens eine andere Codedatei ist:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| public partial class Form1 : Form { public Form1() { this.InitComponents(); }
}
public partial class Form1 { public void InitComponents() { this.Text = "Sample Form";
Button b = new Button(); b.SetBounds(10, 10, 100, 20); b.Text = "Test Button"; this.Controls.Add(b);
Label l = new Label(); l.SetBounds(10, 50, 100, 20); l.Text = "Test Label"; this.Controls.Add(l); } } |
Und wenn du doch eine eigene Klasse haben willst, kannst du es ja immer noch so machen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| public class Form1 : Form { public Form1() { GuiGenerator g = new GuiGenerator(); g.GenerateGUI(this); }
}
public class GuiGenerator { public void GenerateGUI(Form form) { form.Text = "Sample Form";
Button b = new Button(); b.SetBounds(10, 10, 100, 20); b.Text = "Test Button"; form.Controls.Add(b);
Label l = new Label(); l.SetBounds(10, 50, 100, 20); l.Text = "Test Label"; form.Controls.Add(l); } } |
Hoffentlich konnte ich dir damit einigermaßen weiterhelfen
Und bzgl. der Frage
Zitat: | Ist der Designer wirklich so empfindlich? |
habe ich einen Tipp: Wenn du es unbedingt probieren willst, würde ich mir eine Sicherungskopie anlegen
Gruß
stes
_________________ "Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann." Joseph Weizenbaum
|
|
|