2010-05-24 6 views
7

कुछ और जटिल करने की कोशिश करते समय, मैं एक ऐसे व्यवहार में भाग गया जो मुझे समझ में नहीं आता है।टेक्स्ट चेंज किए गए ईवेंट - इसका परिणाम अनंत लूप क्यों नहीं होता है?

टेक्स्ट चेंज किए गए ईवेंट को संभालने के नीचे निम्न कोड मानें।

private void textChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox current = sender as TextBox; 
     current.Text = current.Text + "+"; 
    } 

अब, पाठ बॉक्स में एक चरित्र (जैसे कि, ए) टाइपिंग में घटना अंतिम पाठ के साथ दो बार फिसल गया हो रही है (दो जोड़ने '+' रों) किया जा रहा है सिर्फ ए + से प्रदर्शित परिणाम देगा।

मेरे दो प्रश्न हैं, ईवेंट दो बार क्यों मारा जाता है? और घटना के माध्यम से केवल पहला रन क्यों वास्तव में टेक्स्टबॉक्स का पाठ सेट करता है?

अग्रिम धन्यवाद!

+2

क्यों एक सवाल थोड़ा समझ बनाने के लिए लगता है कि है कम से कम 4 मिनट में 3 upvotes? मुझे यह नहीं मिला .... –

+0

... 5 वोट तक और फिर वापस 3 तक गए? hmmmmm ... –

+1

घटना TextBox.TextChanged उठाया जाता है जब TextBox.Text बदल गया है। नमूना कोड, हालांकि, इस अधिसूचना के दौरान पाठ को बदलता है जिसके परिणामस्वरूप टेक्स्ट चेंजड को आगे बढ़ाया जाना चाहिए जिसके परिणामस्वरूप टेक्स्ट का एक नया परिवर्तन होगा ... -> अंतहीन रिकर्सन।
मुझे नहीं पता था कि यह विशेष मामला स्पष्ट रूप से टेक्स्टबॉक्स वर्ग द्वारा संभाला जाता है - वर्णित प्रभाव नहीं होगा। इसके बजाय, TextChanged केवल एक बार उठाया जाएगा। मैंने इस सवाल के माध्यम से कुछ सीखा और इसलिए इसे उखाड़ फेंक दिया। – Matthias

उत्तर

7

खैर - पाठ संपत्ति सेट करते समय यह/बदला जा रहा है, जबकि यह सिर्फ बदल गया है पाठ बॉक्स वर्ग स्पष्ट रूप से पकड़ा जा रहा है:

बस अंदर देखने के लिए परावर्तक का उपयोग TextBox.OnTextPropertyChanged (छोटा):

TextBox box = (TextBox) d; 
if (!box._isInsideTextContentChange) 
{ 
    string newValue = (string) e.NewValue; 
    //... 
    box._isInsideTextContentChange = true; 
    try 
    { 
     using (box.TextSelectionInternal.DeclareChangeBlock()) 
     { 
      //... 
     } //Probably raises TextChanged here 
    } 
    finally 
    { 
     box._isInsideTextContentChange = false; 
    } 
    //... 
} 

क्षेत्र _isInsideTextContentChange सही पर सेट है से पहले TextChanged घटना आर हो जाता है aised। टेक्स्ट संपत्ति को फिर से बदलते समय, टेक्स्ट चेंज ईवेंट इस प्रकार फिर से नहीं उठाया जाता है।

इसलिए: सुविधा ;-)

संबंधित मुद्दे