UserControl soll Statuslabel der Form aufrufen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    UserControl soll Statuslabel der Form aufrufen

    Hallo,

    ich bin am experimentieren mit einem neuen Projekt, dort würde es sich lohnen je nach Auswahl ein für den (Import von Daten unterschiedlicher Quellen) Zweck optimiertes Usercontrol zu verwenden.
    Soweit ist auch alles kein Problem, das funktioniert alles wie es soll. Dem jeweiligen Usercontrol wird auch das Dataset mit Übergeben, funktioniert auch. Allerdings kann ich das Usercontroll nicht mehr einfach auf die Form ziehen, das funktioniert mit der DS-Erweiterung nicht. Macht auch nichts, ist auch nicht erwünscht die Form fix mit einem Usercontrol zu laden.

    Ich möchte die Vörgänge, die in diesen UCLs angestoßen werden und zeitfressend sind, dem Anwender darstellen. Dazu würde mir die Ausgabe von Statusinformationen auf dem ToolStripStatusLabel im StatusStrip auf der Form reichen.
    Die Vorgänge selbst werden mit

    Quellcode

    1. Async await Task.Run()
    gestartet, die GUI friert nicht ein.
    Ich bekomme es jedoch nicht hin, dass ich wie unter anderem hier beschrieben, auf der Form ein im UCL vorhandenes Ereignis abonnieren kann.
    Dazu habe ich unterschiedliche aber immerhin alles ähnliche Wege ausprobiert, alle scheiterten an der selben Stelle.
    Hier der Code soweit aus dem Usercontrol:

    Spoiler anzeigen

    C#-Quellcode

    1. public partial class uclxxxxxLoadData : UserControl
    2. {
    3. public event EventHandler<TextIOEventArgs> TextRawReceivedEvent;
    4. protected virtual void OnTextRawReceived(string textReceived)
    5. {
    6. EventHandler<TextIOEventArgs> textRawReceived = this.TextRawReceivedEvent;
    7. if (textRawReceived != null)
    8. {
    9. textRawReceived(this, new TextIOEventArgs(textReceived));
    10. }
    11. }
    12. private void btnGPData2MigData_Click(object sender, EventArgs e)
    13. {
    14. OnTextRawReceived("Kopieren läuft, bitte warten...");
    15. //weiteres, was aber funktioniert ..
    16. }



    Die benötigte Klasse TextIOEventArgs ist natürlich vorhanden.
    Im Usercontrol gibt es auch keinen Fehler.

    Hier der Code der Form, soweit es den Aufruf betrifft:

    Spoiler anzeigen

    C#-Quellcode

    1. public UserControl ucl = null;
    2. private void cmbExternalSystemType_SelectionChangeCommitted(object sender, EventArgs e)
    3. {
    4. if (ucl != null)
    5. {
    6. this.tlpTest.Controls.Remove(ucl);
    7. ucl = null;
    8. }
    9. if (cmbExternalSystemType.SelectedIndex == 1)
    10. {
    11. ucl = new uclxxxxxLoadData(this.migrationDataSet1);
    12. ucl.TextRawReceivedEvent += ucl_StatusText_Event; //"UserControl" enthällt keine Definition für "TextRawReceivedEvent" und es konnte keine TextRawReceivedEvent-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ UserControll akzeptiert.
    13. this.tlpTest.Controls.Add(ucl, 0, 0);
    14. }
    15. }
    16. public void ucl_StatusText_Event(Object objSender, EventArgs e)
    17. {
    18. if (e != null)
    19. this.tssl_Status.Text = e.ToString();
    20. }


    Hat jemand einen Rat für mich, wie ich das Problem lösen kann?
    Ich habe mit eigene Formen für diese Dinge angefangen, was aber optisch etwas unpassend in dem Projekt ist.
    probierma

    C#-Quellcode

    1. public UserControl ucl = null;
    2. private void cmbExternalSystemType_SelectionChangeCommitted(object sender, EventArgs e){
    3. if (ucl != null){
    4. this.tlpTest.Controls.Remove(ucl);
    5. ucl = null;
    6. }
    7. if (cmbExternalSystemType.SelectedIndex == 1){
    8. var u = new uclxxxxxLoadData(this.migrationDataSet1);
    9. ucl = u;
    10. u.TextRawReceivedEvent += ucl_StatusText_Event; //"UserControl" enthällt keine Definition für "TextRawReceivedEvent" und es konnte keine TextRawReceivedEvent-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ UserControll akzeptiert.
    11. this.tlpTest.Controls.Add(ucl, 0, 0);
    12. }
    13. }
    14. public void ucl_StatusText_Event(Object objSender, EventArgs e){
    15. if (e != null)this.tssl_Status.Text = e.ToString();
    16. }
    tut mir leid wegen dem Layout, dein Code kompiliert nicht, und dann layoutet VS auch nicht vernünftig.
    @ErfinderDesRades
    Also einfach ist das für mich nicht. Ich komme klar mit allgemeinen Datentypen (int, decimal, string etc.). Mit diesen Typen komme ich eher nicht zurecht, vor allem verstehe ich nicht warum sich das so verhält, wie es sich verhält.
    Aus meiner Sicht und nach allen Anleitungen die ich gelesen habe, hatte ich nichts falsch gemacht. Das UserControl war instanziert, aber offensichtlich nicht so, wie Visual Studio das benötigt, und da hört eben auch mein Verständnis auf.
    Klar habe ich mir sofort die Datentypen angesehen, ist ja nun kein Probelm mit der Maus drüber zu gehen. Bei linq Abfragen vermeide ich das var sogar und ersetze es immer mit den korrekten Datentypen der entsprechenden Tabellen.

    ucl ist vom Datentyp UserControl (frmMain.ucl) und
    u ist vom Datentyp UserControls.uclxxxxxLoadData

    Verstehen tu ich es dennoch nicht.
    Okay, mein ucl erbt ja auch nur von Windows.Form.UserControl. Wenn Du es erklärst wird es logischer.
    Ich meine aber mein ucl zu benötigen, damit ich ein vorhandenes UserControl bei einer Neuwahl vorher entfernen kann. Hätte ich da andere Möglichkeiten?
    Mit UserControls habe ich zuvor nie gearbeitet, von daher ist das etwas Neuland für mich und entspricht in dieser Hinsicht auch nicht dem Umgang mit Formen.

    Dksksm schrieb:

    Ich meine aber mein ucl zu benötigen, damit ich ein vorhandenes UserControl bei einer Neuwahl vorher entfernen kann. Hätte ich da andere Möglichkeiten?
    Ich versteh die Frage nicht - gibts denn derzeit iein Problem?
    Nach dem, was ich gecodet habe kannst du dein ucl ebensogut benutzen wie zuvor.
    Jo, hab ich ja auch sofort festfestellt. Meine Frage zielt nur darauf hin ab, ob sich der Code nicht noch vereinfachen liesse. Das scheint aber nicht so zu sein, wie ich durch herumprobieren festegstellt habe.
    Das eigentliche Problem ist ja mit der von Dir vorgstellten Lösung auch erledigt. Danke Dir und

    Dir und allen Mitlesern hier im Forum
    einen guten Rutsch ins neue Jahr.