Autor Beitrag
DennisXX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: 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?

ausblenden 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.:

ausblenden Quelltext
1:
2:
3:
4:
5:
private void InitializeComponent()
{
    EigeneKlasse ownClass = new EigeneKlasse();
    ownClass.generateGUI();   
}


Die eigene Klasse würde dann so aussehen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Mi 17.08.11 10:11 
Hallo !

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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)?

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36
Erhaltene Danke: 6

Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
BeitragVerfasst: 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:

ausblenden 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(101010020);
            b.Text = "Test Button";
            this.Controls.Add(b);

            Label l = new Label();
            l.SetBounds(105010020);
            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:

ausblenden 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();
        }

        /* ... */
    }

    // zweite Codedatei mit Komponenten
    public partial class Form1
    {
        public void InitComponents()
        {
            this.Text = "Sample Form";

            Button b = new Button();
            b.SetBounds(101010020);
            b.Text = "Test Button";
            this.Controls.Add(b);

            Label l = new Label();
            l.SetBounds(105010020);
            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:

ausblenden 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(101010020);
            b.Text = "Test Button";
            form.Controls.Add(b);

            Label l = new Label();
            l.SetBounds(105010020);
            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