none
Programmabschnitt ausführen RRS feed

  • Frage

  • Hallo,

    ich bezeichne mich mal als Neueinsteiger in C#, habe mir einige Bücher und Dokus durchgelesen und versuche nun zu üben, die zahlreichen Beispiele welche ich in Zusammenhang mit der Literatur gefunden habe, speichere ich mir in einer Windows Form Anwendung , jedes Beispiel oder jede Übung die ich neu mache, wird dann in einem neuen Fenster ausgeführt, quasi:
    Einstiegsfenster mit Buttons zu Kapitel x,yz wo sich dann ein passendes Form öffnet, wo ich dann wieder Buttons zum auswaehlen habe für das öffnen weiter fenster.

    Wenn ich also eine Übung mache und diese testen möchte, muss ich immer die ganze Anwendung starten, und mich durchklicken bis zu dem Fenster wo ich meine aktuelle Übung hinterlegt habe.

    Gibt es eine möglichkeit aus der Entwicklungsumgebung direkt in diesen Abschnitt zu springen? Ohne das ich den Rest des Programm ausführen muss?

    Also ich ich übe gerade an einem Beispiel das sich Counter nennt, um dieses Beispiel zur Laufzeit anzuschauen muss ich erst die Anwendung starten, dann auf Button Kapitel X klicken, ein fenster geht auf, dort klicke ich ein Button "Counter Beispiele" ein weiteres Fenster geht auf, dort klicke ich ein weiteren Button welches mir ein Fenster öffnet wo dann meine Counter Anwendung "Zaehler" läuft.

    Da der Rest der Anwendung schon "funktioniert" würde ich aus der Entwicklungsumgebung gerne nur diese letzte Form aufrufen wo dann meine Applikation "Zaehler" laeuft. Um mir das durchklicken zu sparen.

    Danke.
    Donnerstag, 6. August 2009 08:10

Antworten

  • Hallo,

    ein Universal-Rezept dafür gibt es nicht, für Testprogramme oder Übungen schon gar nicht.
    Das Programm kann ja schon mal nicht wissen, was Dein letztes Formular ist

    Auch meine diversen Beispielformulare und kleinen Codeschnippsel, die ich u. a. für
    Foren und Newsgroups schreibe sind, ein chaotisches Sammelsurium.
    Für den Start nutze ich da ähnlich wie Du ein Start Formular,
    wo ich  über eine Schaltfläche Code-Abschnitte starte -
    die ich nach Gebrauch wieder auskommentiere.

    Vereinfachen kann man sich das für einheitlichen Dinge wie das Aufrufen
    von Formularen durch ein bisschen Reflection.

    Unten stehender rudimentäre Codeabschnitt füllt eine FormComboBox mit allen
    Formulartypen die im Programm vorhanden sind. 
    Über eine Schaltfläche ShowFormButton wird das jeweils ausgewählte Formular angezeigt.
    Die Liste kann auch auf weiteres wie eingebunde Bibliotheken erweitern könnte,
    das überlasse ich aber mal als Übung zu Reflection Dir ;-)

            public MainForm()
            {
                InitializeComponent();
                InitializeForms();
            }
    
            /// <summary>
            /// Initialisiert eine ComboBox mit den verfügbaren Formularen.
            /// </summary>
            private void InitializeForms()
            {
                List<string> formNames = new List<string>();
                foreach (Type type in this.GetType().Assembly.GetTypes())
                {
                    if (typeof(Form).IsAssignableFrom(type))
                    {
                        formNames.Add(type.FullName);
                    }
                }
                formNames.Sort();
                this.FormComboBox.Items.AddRange(formNames.ToArray());
            }
    
            /// <summary>
            /// Erzeugt eine Formular-Instanz für den ausgewählten Type.
            /// </summary>
            private void ShowFormButton_Click(object sender, EventArgs e)
            {
                const BindingFlags FormBindingFlags =
                    BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
    
                if (this.FormComboBox.SelectedIndex >= 0)
                {
                    string formName = (string)this.FormComboBox.SelectedItem;
                    // Hier in der gleichen Assembly wie das Startformular
                    System.Reflection.Assembly assembly = this.GetType().Assembly;
                    try
                    {
                        Form form = (Form)assembly.CreateInstance(formName,
                            false, FormBindingFlags, null,
                            new object[0], null, null);
    
                        // Ist per Konvention ein Dialog
                        if (formName.EndsWith("Dialog"))
                        {
                            DialogResult result = form.ShowDialog(this);
                            MessageBox.Show(string.Format(null,
                                "DialogResult: {0}", result));
                            form.Dispose();
                        }
                        else
                        {
                            form.Show(this);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(String.Format(null,
                            "Formular {0} konnte nicht erstellt werden:\r\n{1}", formName, ex.Message));
                    }
                }
            }
    
    Gruß Elmar

    Donnerstag, 6. August 2009 21:29

Alle Antworten

  • Hallo,

    ein Universal-Rezept dafür gibt es nicht, für Testprogramme oder Übungen schon gar nicht.
    Das Programm kann ja schon mal nicht wissen, was Dein letztes Formular ist

    Auch meine diversen Beispielformulare und kleinen Codeschnippsel, die ich u. a. für
    Foren und Newsgroups schreibe sind, ein chaotisches Sammelsurium.
    Für den Start nutze ich da ähnlich wie Du ein Start Formular,
    wo ich  über eine Schaltfläche Code-Abschnitte starte -
    die ich nach Gebrauch wieder auskommentiere.

    Vereinfachen kann man sich das für einheitlichen Dinge wie das Aufrufen
    von Formularen durch ein bisschen Reflection.

    Unten stehender rudimentäre Codeabschnitt füllt eine FormComboBox mit allen
    Formulartypen die im Programm vorhanden sind. 
    Über eine Schaltfläche ShowFormButton wird das jeweils ausgewählte Formular angezeigt.
    Die Liste kann auch auf weiteres wie eingebunde Bibliotheken erweitern könnte,
    das überlasse ich aber mal als Übung zu Reflection Dir ;-)

            public MainForm()
            {
                InitializeComponent();
                InitializeForms();
            }
    
            /// <summary>
            /// Initialisiert eine ComboBox mit den verfügbaren Formularen.
            /// </summary>
            private void InitializeForms()
            {
                List<string> formNames = new List<string>();
                foreach (Type type in this.GetType().Assembly.GetTypes())
                {
                    if (typeof(Form).IsAssignableFrom(type))
                    {
                        formNames.Add(type.FullName);
                    }
                }
                formNames.Sort();
                this.FormComboBox.Items.AddRange(formNames.ToArray());
            }
    
            /// <summary>
            /// Erzeugt eine Formular-Instanz für den ausgewählten Type.
            /// </summary>
            private void ShowFormButton_Click(object sender, EventArgs e)
            {
                const BindingFlags FormBindingFlags =
                    BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
    
                if (this.FormComboBox.SelectedIndex >= 0)
                {
                    string formName = (string)this.FormComboBox.SelectedItem;
                    // Hier in der gleichen Assembly wie das Startformular
                    System.Reflection.Assembly assembly = this.GetType().Assembly;
                    try
                    {
                        Form form = (Form)assembly.CreateInstance(formName,
                            false, FormBindingFlags, null,
                            new object[0], null, null);
    
                        // Ist per Konvention ein Dialog
                        if (formName.EndsWith("Dialog"))
                        {
                            DialogResult result = form.ShowDialog(this);
                            MessageBox.Show(string.Format(null,
                                "DialogResult: {0}", result));
                            form.Dispose();
                        }
                        else
                        {
                            form.Show(this);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(String.Format(null,
                            "Formular {0} konnte nicht erstellt werden:\r\n{1}", formName, ex.Message));
                    }
                }
            }
    
    Gruß Elmar

    Donnerstag, 6. August 2009 21:29
  • Hallo elTorito,

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Montag, 28. September 2009 21:12
  • Hallo elTorito,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Dienstag, 6. Oktober 2009 21:00