Warum wird Text in MaskedTextBox bei "Enter" nicht markiert?



  • Hallo!

    Ich versuche gerade eine Funktion zu schreiben, die schaut welche Textbox sie bei dem Ereignis "Enter" aufgerufen hat, und in dieser dann den Text zu markieren.
    Die Überprüfung funktioniert auch, allerdings wird nichts markiert...
    Warum?

    private: System::Void test(System::Object^  sender, System::EventArgs^  e)
    			 {
    				 if(sender == this->MaskedTextBox1)
    					 this->MaskedTextBox1->SelectAll();
    			 }
    

    Ich bin dankbar für jede Hilfe!



  • Ich finde einfach keinen Fehler, probiere schon seit Stunden... 😞

    Was muss ich tun, damit meine masked Textboxen ihren Inhalt markieren, wenn ich beim "durch-tabben" diese aktiviere?

    Kann mir jemand helfen?



  • eine frage,
    ist die funktion denn auch an ein ereignis der textbox gebunden? ich würde zum beispiel vorschlagen das du das ereignis "enter" damit verbindest

    in der Funktion InitializeComponent()

    this->maskedtextBox->Enter += gcnew System::EventHandler(this, &Form1::maskedtextBox_Enter);
    
    private: System::Void maskedtextBox_Enter(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 maskedtextBox->SelectAll();
    		 }
    


  • Bei den Eigenschaften im Designer habe ich dem Ereignis "Enter" meine Unterfunktion zugeordnet, die wird definitiv ausgeführt!

    Wenn ich mir da zum Beispiel eine MessageBox reinsetze, wird die angezeigt.
    Aber das Markieren des Texts in der Textbox, nur das was ich will, geht natürlich nicht...



  • warum rufst du den sender ab? nimm doch einfach die if-abfrage weg
    achso eh ichs vergess habs nämlich auch grad bei mir getestet
    der markiert natürlich auch nur dann wenn auch tatsächlich ein Inhalt in der Textbox iss. die Platzhalter werden NICHT als Inhalt angesehen



  • Weil ich denke es ist übersichtlicher den Code in eine Funktion zu packen, und bei mehreren Textboxen wo ich das haben will einfach immer die selbe Funktion aufzurufen.

    private: System::Void test(System::Object^  sender, System::EventArgs^  e)
    		{
    			if(sender == this->MaskedTextBox1)
    				this->MaskedTextBox1->SelectAll();
    
    			 if(sender == this->MaskedTextBox2
    				 this->MaskedTextBox2->SelectAll();
    
    			 if(sender == this->MaskedTextBox3
    				 this->MaskedTextBox3->SelectAll();
    		}
    


  • ist die funktion test denn auch mit dem jedem event der textboxen verbunden? denn es ist so das die funktion nur dann aufgerufen wird wenn das entsprechende ereignis der verbundenen textbox auch eintritt



  • Der event heißt "Enter":

    MSDN:

    Control.Enter-Ereignis
    
    Tritt beim Eintreten in den Bereich des Steuerelements ein.
    

    Ich denke mal, dass der Aufruf ok ist.
    Anderer Code da drin geht ja, nur das markieren nicht - selbst wenn was drinsteht... (maskierte Box, dürfen nur Zahlen rein)



  • ja, aber NUR bei dem zugeordneten element. wenn enter nur einem der textboxen zugeordnet ist, tritt das ereignis auch nur bei dem betreten der einen zugeordneten textbox ein, es sei denn das ereignis ist jeder der textboxen zugeordnet



  • Klar ist das jeder Textbox zugeordnet, sonst hätte es ja auch keinen Sinn die aufrufende Textbox mit "sender" abzufragen...
    Deswegen habe ich das doch so gelöst. 😉

    Mein Problem ist wie gesagt aber nicht der Aufruf, sondern der Befehl funktioniert einfach nicht:

    this->MaskedTextBox3->SelectAll();
    


  • Google hilft:

    MaskedTextBox SelectAll :

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=194478&SiteID=1

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void maskedTextBox1_Enter(object sender, EventArgs e)
            {
                MaskedTextBox box = (MaskedTextBox)sender;
                BeginInvoke((MethodInvoker)delegate() { box.SelectAll(); });
            }
        }
    

    Ich hab ehrlich gesagt keine Ahnung wie man nun in C++ den anonymen Delegaten umsetzt, daher etwas umständlicher:

    private: delegate void SelAllDelegate(MaskedTextBox ^ box);
    
    	private:  void SelectAllA(MaskedTextBox ^ box)
    			 {
    				box->SelectAll();
    			 }
    
    	private: System::Void maskedTextBox1_Enter(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 MaskedTextBox ^ box = safe_cast<MaskedTextBox^>(sender);
    
    				 BeginInvoke(gcnew SelAllDelegate(this,&Form1::SelectAllA),gcnew cli::array<Object^>(1){box});
    			 }
    

    Beispiel:

    http://www.diskussionspunkt.de/help/cpp/MaskedTextBox_Enter.zip



  • Vielen Dank Knuddlbaer, der Code funktioniert!

    Allerdings verstehe ich nicht was da steht...
    Ist "Delegat" das Stichwort, nach dem ich suchen und wo ich mich einlesen muss?

    Gruß



  • Naja, im gefundenen Beitrag schreib MS:

    The MaskedTextBox performs a select of its own in the focused event, so it overrides your set. You'll need to post your select after the MaskedTextBox performs its select. You can do this by using the BeginInvoke method

    -mark

    Program Manager

    Microsoft

    This post is provided "as-is"

    Welche Auswirkungen das nun im Detail hat kann ich Dir nicht sagen, ich habe mich mit den Events der Controls noch nicht so intensiev auseinander gesetzt um erklären zu können warum das BeginInvole abhilfe schafft.


Anmelden zum Antworten