Globale Eventhandler?



  • Hallo, ich habe nun ein Programm mit ca. 500 Textboxen erstellt. Diese sollen immer wenn man den Wert einer Textbox ändert alle neu berechnet werden. Jetzt möchte ich nicht hingehen und jeder Textbox einzeln ein "MouseLeave" Event zuweisenm, sondern das soll für alle Textbixen so sein. Ich habe schon verschiedenes versucht um die Klasse Textbox zu überladen, so das bei "MouseLeave" generell meine Methode calculate aufgerufen wird. Krieg das aber nicht hin, kann mir wer vielleicht kurz auf die Sprünge helfen?

    Thx in adavance, Tom



  • Zeig mal wie Du das versucht hast



  • Warum gehst Du nich einfach alle durch und weist den Event zu!?

    for each(Control ^c in this->Controls)
    {
      TextBox ^tb = dynamic_cast<TextBox^>(c);
      if (tb != nullptr)
        tb->Leave += gcnew System::EventHandler(this, &Form1::tb_Leave);
    }
    


  • Cool, danke, das tuts auf jeden Fall auch. Bezieht sich das eigentlich jetzt auf alle Controls, oder nur auf die Textbox? Das dynamic_cast ist mir nicht so ganz geläufig. Für Checkboxen wär es auch klasse, denk das krieg ich aber schon hin. 🙂

    Rein interessehalber, kennt irgendwer auch die Lösung mittels Überladen der Textboxklasse?



  • Mein Beispiel geht alle Controls auf der *obersten* Ebene durch und schaut dann mittels "dynamic_cast" nach ob das Control eine TextBox (oder abgeleitet) ist.



  • Hi, also irgendwie funktioniert das bei mir immer noch nicht so ganz.

    for each(Control ^c in this->Controls) 
    	{ 
    
    		TextBox ^tb = dynamic_cast<TextBox^>(c);
    
    		if (tb != nullptr) 
    			tb->Text = "TEST";
    
    		//tb->Leave += gcnew System::EventHandler(this, &Form1::tb_Leave); 
    	}
    

    Irgendwie ist tb immer der Nullpointer, ansonsten müssten ja alle meine Textboxen TEST anzeigen. Vielleicht kannst du nochmal kurz kucken, ich versteh nicht so ganz warums nicht funtioniert.



  • Hast Du schon einmal im Debugmodus geschaut, ob da nicht eine Operation vor einer anderen stattfindet? Also sind die Objekte schon erstellt?
    (Mir passiert das dann schon immer mal wieder, also wer weiss...)



  • Wie ich geschrieben habe: Es geht nur die *oberste* Ebene durch!!!
    Wenn Du alle textBoxen finden willst, dann musst Du das ganze rekursiv machen!!! (also wenn z.B. eine TextBox in einem Panel drin ist).



  • Ummm, jo das ist wohl der Fall. Ich habe alles in Grupboxen und Panels organiesiert, aussenrum sind noch TabPages. Wie mach ich es das die Anweisung rekursiv dann auch bis zur untersten Ebene abgrast? Ich steh grad voll auf dem Schlauch 😕



  • void AssignEventHandler(Control ^parent)
    {
      for each(Control ^c in parent->Controls)
      {
        TextBox ^tb = dynamic_cast<TextBox^>(c);
        if (tb != nullptr)
          tb->Leave += gcnew System::EventHandler(this, &Form1::button3_Click);
        else 
          AssignEventHandler(c);
      }
    }
    

    und Aufruf z.B. mit

    Form1(void)
    {
      InitializeComponent();
      //
      //TODO: Add the constructor code here
      //
      AssignEventHandler(this);
    }
    


  • Super danke! Ich probiers gleich mal aus.


Anmelden zum Antworten