none
Eigenschaft .Name ohne Wert einer Form von einer MDI-Anwendung RRS feed

  • Frage

  • Hallo,
    von einer MDI-Anwendung will ich alle darin geöffneten Formen auflisten.
    Den Vergleich wollte ich über die Eigenschaft .Name realisieren.

    Die gesuchte Form wird gefunden. Doch die Eigenschaft .Name enthält keinen Wert.

    Weiß jemand warum?
    Gibt es eine Möglichkeit den Namen der geöffneten Form (MdiChildren) abzufragen?


    for (int i = 0; i < MdiChildren.Length; i++ )
    {
     if (MdiChildren[i].Name == "TestMdiChildrenView")
     {
      MdiChildren[i].Activate();
      return;
     }
    }

    Alexander

    Samstag, 31. Dezember 2011 20:51

Antworten

  • Hallo Alexander,

    normalerweise sollte die Name Eigenschaft dem Typen / Klasse des Formulars entsprechen,
    vorausgesetzt Du hast es mit dem Designer erstellt.

    Aber Zeichenketten als Identifikation sind allgemein problematisch.
    Denn Klassennamen ändert man schon mal, und eine Zeichenkette wird dabei schnell vergessen.
    Und so ist i. a. besser die Instanzen über den Typ zu identifizieren.

    Hier bietet sich ein wenig LINQ an:

        var form = this.MdiChildren.OfType<TestMdiChildrenView>().FirstOrDefault();
        if (form != null)
            form.Activate();
    
    
    Gruß Elmar

    • Als Antwort markiert AlexanderRi Sonntag, 1. Januar 2012 20:40
    Sonntag, 1. Januar 2012 10:03
    Beantworter

Alle Antworten

  • Hallo Alexander,

    normalerweise sollte die Name Eigenschaft dem Typen / Klasse des Formulars entsprechen,
    vorausgesetzt Du hast es mit dem Designer erstellt.

    Aber Zeichenketten als Identifikation sind allgemein problematisch.
    Denn Klassennamen ändert man schon mal, und eine Zeichenkette wird dabei schnell vergessen.
    Und so ist i. a. besser die Instanzen über den Typ zu identifizieren.

    Hier bietet sich ein wenig LINQ an:

        var form = this.MdiChildren.OfType<TestMdiChildrenView>().FirstOrDefault();
        if (form != null)
            form.Activate();
    
    
    Gruß Elmar

    • Als Antwort markiert AlexanderRi Sonntag, 1. Januar 2012 20:40
    Sonntag, 1. Januar 2012 10:03
    Beantworter
  • Grüße Alexander.

    Hast du der Form einen Namen gegeben? Die Voreinstellung ist "";

     

    Form form = new Form();
    form.Name = "TestMdiChildrenView";
    form.MdiParent = ParentForm;
    // usw.
    

     

    Sonntag, 1. Januar 2012 10:15
  • Hallo Elmar,
    vielen Dank für Deine Hilfe. Der Hinweis auf die Identifizierung über den Typ war sehr hilfreich und richtig.

    Das gleiche Problem (String-Identifizierung über die Eigenschaft .Name) habe ich bei vier Button.
    Alle vier Button (buttonA, buttonB, ...) habe den gleichen Click-Event-Handler.
    Wie kann ich hier über den Typ prüfen, welcher Button das Click-Ereignis ausgelöst hat?

    switch (true)
    {
      case ??????:  // buttonA
      break;
    }


    Alexander

    Sonntag, 1. Januar 2012 18:31
  • Hallo Alexander,

    bei gleichartigen Typen benötigt man ein zusätzliches Unterscheidungsmerkmal
    (extra eine Ableitung lohnt dafür nun wirklich nicht)

    Wenn sich das Splitten in mehrere Handler nicht lohnt, so wirst Du um eine Identifikation
    über Name (und / oder Tag) Eigenschaft nicht herum kommen.

    Es empfiehlt sich, die Zeichenkette als Konstante (const) zu hinterlegen,
    so dass die Verwendung erkennbar ist und eine Anpassung leichter fällt.

    switch ist in C# insofern limitiert als nur konstante Ausdrücke bei case zulässig sind.
    (VB's Select kann mehr, erzeugt effektiv dazu entsprechende If ... ElseIf Anweisungen).

    Gruß Elmar
    Sonntag, 1. Januar 2012 19:54
    Beantworter