Laden...

Wizard mit Controls

Letzter Beitrag vor 16 Jahren 20 Posts 2.146 Views
Wizard mit Controls

SO jetzt schreieb ich einen neunen Eintrag zu einem neuen Thema 😉
Tja wie ich bereits gesucht habe handelt es sich bei meinem Problem um eine Art Wizard.
Ich habe meine Form, in der ein SplitContainer enthalten ist. nach klich auf einen Button wird im SplitContainer.Panel2 eine USerControl geladen. Wenn ich nun in meinem UserControl auf den Button weiter klicke, möchte ich, dass anstelle des jetzigen UserControls ein neues geladen wird! Kann mir da wer weiterhelfen?

Kann mir da wer weiterhelfen?

klar. schick mir pm dann geb ich dir meine bankverbindung und nach einer angemessenen überweisung reden wir weiter.

ansonsten stell bitte eine konkrete frage zu einem konkreten problem, das nicht zu den grundlagenverständniss der sprache gehört.

Wenn ich nun in meinem UserControl auf den Button weiter klicke, möchte ich, dass anstelle des jetzigen UserControls ein neues geladen wird! Kann mir da wer weiterhelfen?

Der Button in Deinem UserControl hat eine Eigenschaft PostBackURL, dort könntest Du die URL mit der neu zu ladenden Seite angeben. (Sollte ich Dich richtig verstanden habe).

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

Naja ich weiß jetzt nicht wirklich, was ich da genauer beschreiben sollte. Die Frage is, wie kann ich von einem USerControl auf meien Form zugreifen(in der sich das USerControl befindet), und ein neus UserControl laden, sprich austauschen. So wie bei einem Wizard, nachdem man auf weiter klickt kommt die nächste Eingabemaske

@schaedld:

soweit kommt es noch das man in winforms web-seiten laden muss ^^

edit: zum problem siehe:
[FAQ] Kommunikation von 2 Forms

soweit kommt es noch das man in winforms web-seiten laden muss ^^ Heut ist nicht mein Tag X(

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

Generell sollte der "Weiter"-Button wohl besser nicht auf dem UserControl liegen. Dann hättest Du das Problem gar nicht erst.

:::

Text auf einem Button im Computer Museum Boston, USA

Ja an das hab ich auch schon gedacht, gibt es aber nicht die möglichkeit das userConrol zu schließen?

edit: zum problem siehe:

>

In der anderen Diskussion, die insoweit abgebrochen wurde, hatte ich Dich auf die Forumssuche verwiesen. 2 der 3 Treffer zu usercontrol mehrere nacheinander würden etwas weiterhelfen. Jürgen

Such mal bei CodeProject nach einem Wizard-Framework von Gary Noble (ist in VB.NET geschrieben, sollte aber leicht zu verstehen sein).

Um nochmals etwas zu dem Beitag zu nennen, würde es nicht möglich sein, die Controlls in eine Liste zu packen und dann sie von der Lieste aus abrufen ?

ja, eine der möglichkeiten.
man kann das aber pauschal nciht sagen, da es manchmal auch besser sein kann, usercontrols erst dann zu instanziieren wenn man sie auch wirklich braucht, da sie auch recht umfangreich sein können. reicht im prinzip, wenn der webbrowsercontrol auf einem usercontrol mit drauf ist. den dann kostet das initialisieren schon viel performance.

Ein sauberer Weg wäre tatsächlich die Controls in eine Liste zu packen, doch das reicht nicht aus. Durch eine gemeinsame Schnittstelle werden die jeweiligen Controls sauberer implementiert - das hat den Sinn das nur eindeutige Controls rein geladen werden und nicht "irgendwelche".


    public enum ControlTypes
    {
      None = 0,
      ControlA,
      ControlB
    }

    public interface ILoader
    {
      ControlTypes ControlType { get;}

      void Load(Control parent);
    }

    public class UserControlA : UserControl, ILoader
    {

      #region ILoader Members

      public ControlTypes ControlType
      {
        get { return ControlTypes.ControlA; }
      }

      public new void Load(Control parent)
      {
        this.Parent = parent;
        this.Show();
      }

      #endregion
    }

    public class MyWizzard : Form
    {
      private ILoader[] List = new ILoader[] { new UserControlA() };

      public bool LoadControl(ControlTypes _eControlTypes)
      {
        ILoader iLoad = Array.Find<ILoader>(this.List, delegate(ILoader load)
        { 
          return load.ControlType == _eControlTypes;
        });

        if(iLoad == null) return false;

        iLoad.Load(<MyPanelControl>); // hier halt das Panel
        return true;
      }
    }

Disposen / Close sollte man nach dem gebrauch nicht gleich aufrufen, da man schließlich auch wieder einen Step zurückgehen kann und die bisherigen Einstellungen sollen ja wieder erscheinen.

Meistens nutze ich dafür aber nen TabControl, lege das Ding vertikal und schalte die TabPages dann Step by Step frei. Sieht meistens etwas hübscher aus als einfach nur UserControls.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Ja und wo füg ich hier dann mein UserControl ein, das ich bereits erstellt habe mit de Form Designer? Besteht hier eine möglcihkeit?

nein.

das setzt vorraus, das du weißt wie du alles manuell machen kannst.

Hrm, das hinzufügen funktioniert z.b. über einen ButtonEvent indem dort die Methode LoadControl aufrufst. Um herauszufinden welches dein aktuell angezeigtes UserControl ist findest du über <myPanel>.Controls[] heraus indem nach ILoad (UserControl) suchst. Du kannst es dir auch beim Methodenaufruf von LoadControl global merken - das ist dir überlassen.

Wenn du das ganze allerdings im Designer machen möchtest, kannst du auch ein HauptUserControl erstellen das als Property eine Liste von ChildUserControls vom Typ ILoad beinhaltet zur verfügung stellen und diese zur Laufzeit im Designer hinzufügen. Das Editieren geht so allerdings nicht - möglich ist es aber ganz ehrlich das kostet Zeit und die erklärung dazu würde hier einige Seiten verbrauchen. Sieh dir dazu bei den CodeSnippeds und auf der MSDN Seite alles rund um das Thema Designer Support Laufzeitunterstüzung Komponenten wie den ganzen Schnittstellen an und vorallem die WindowsNachrichten. Da müsstest überall drin rumfummeln damit einen Wizzard als Komponente später zur Laufzeit mit Designersupport zur verfügung hast.

Wenn es als Projekt hier reinstellen möchtest, gebe ich dir gerne weitere Tipps. Nur für eine normale Lösung lohnt sich der Aufwand nicht.

[Edit]
JAck30lena war schneller 😮)

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Vielleicht ginge aus auch das wenn du dein Usercontrol erzeugst es serialisierst , dann muss es nicht zwangsläufig genau das Usercontrol sein das an dieser stelle ist.



DataObject dataObject = new DataObject(DataFormats.Serializable, meinUsercontrol);


EDIT* ^^ geht nicht so, hab jetzt aber keine Zeit grad es umzudenken.

So kann denke ich jedes Usercontrol das in Panel2 landet wegeklickt werden. Naja irgendwie so ^^, bin mir jetzt auch nicht sicher. Falls es definitiv nimmer brauchst kannst auch disposen.

Hrm, die Idee ist gut und wirst lachen verwende diese auch Schnueggel. Man kann das ganze weiter treiben indem man hier mit XML arbeitet und von aussen her diese sogar bearbeiten kann und sich bisherige Einstellungen sogar merkt. Nur was ich leider nicht bewerten kann ist dann gleich eine Umsetzung via WPF - habe damit einfach noch keine Erfahrung.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Dann kann der Weiter-Button ja einfach auf das dataobject zugreifen



protected override void OnButtonClick(Eventargs e)
{
   base.OnButtonClick(e);
   momentanes_usercontrol = dataObject.GetDataPresent(DataFormats.Serializable, true) as UserControl;
   
   panel2.Controls.Remove(momentanes_usercontrol);

}

So etwa denk ich kann es gehn, wenn es definitiv nur der eine Button sein kann der in dem Panel2 ist, kannst den ja auch direkt ansprechen dann weisst ja welcher es ist.