WinForms TextBox बनाना आपके ब्राउज़र के एड्रेस बार की तरह व्यवहार करता है


154

जब C # WinForms टेक्स्टबॉक्स फोकस प्राप्त करता है, तो मैं चाहता हूं कि यह आपके ब्राउज़र के एड्रेस बार की तरह व्यवहार करे।

यह देखने के लिए कि मेरा क्या मतलब है, अपने वेब ब्राउजर के एड्रेस बार में क्लिक करें। आप निम्नलिखित व्यवहार पर ध्यान देंगे:

  1. यदि टेक्स्टबॉक्स पहले से फोकस नहीं किया गया था, तो टेक्स्टबॉक्स में क्लिक करके सभी टेक्स्ट को चुनना चाहिए।
  2. टेक्स्ट बॉक्स में माउस को नीचे की ओर खींचें और केवल उस पाठ का चयन करें जिसे मैंने माउस के साथ हाइलाइट किया है।
  3. यदि टेक्स्टबॉक्स पहले से ही केंद्रित है, तो क्लिक करने से सभी टेक्स्ट का चयन नहीं होता है।
  4. टेक्स्टबॉक्स को प्रोग्रामेटिक रूप से या कीबोर्ड टेबिंग के माध्यम से फोकस करके सभी टेक्स्ट को चुनना चाहिए।

मैं WinForms में ठीक यही करना चाहता हूं।

सबसे तेजी से बंदूक चेतावनी: जवाब देने से पहले कृपया पढ़ें! धन्यवाद दोस्तों। :-)

कॉलिंग .SelectAll () .Enter या .GotFocus घटनाओं के दौरान काम नहीं करेगा क्योंकि यदि उपयोगकर्ता ने टेक्स्टबॉक्स पर क्लिक किया है, तो कैरट को रखा जाएगा जहां उसने क्लिक किया, इस प्रकार सभी पाठ को हटा दिया गया।

कॉलिंग .SelectAll () .Click इवेंट के दौरान काम नहीं करेगा क्योंकि उपयोगकर्ता माउस के साथ किसी भी पाठ का चयन करने में सक्षम नहीं होगा; .SelectAll () कॉल उपयोगकर्ता के पाठ चयन को अधिलेखित करता रहेगा।

StartInvoke ((Action) textbox.SelectAll) को फ़ोकस / एंटर इवेंट पर कॉल करने से काम नहीं चलता है क्योंकि यह नियम # 2 को तोड़ता है, यह फ़ोकस पर उपयोगकर्ता के चयन को ओवरराइड करता रहेगा।


3
कृपया स्पष्ट करें कि यह "RichTextBox" के लिए है।
नेसियो

Nescio, एक टेक्स्ट बॉक्स या एक रिच टेक्स्ट बॉक्स करेगा। मैंने एक टेक्स्ट बॉक्स पर भी आपके समाधान की कोशिश की।
जुडाह गेब्रियल हिमांगो

यह एक अमूर्त रिसाव है। WM_MOUSEACTIVATE-ing नहीं तो WM_SETFOCUS पर WM_MOUSEACTIVATE और SelectAll को फ़्लैग करने के लिए इसे करने का सबसे अच्छा तरीका है।
wqw

जवाबों:


109

सबसे पहले, जवाब के लिए धन्यवाद! कुल 9 जवाब। धन्यवाद।

बुरी खबर: सभी जवाबों में कुछ क्वर्क थे या बिल्कुल सही (या बिल्कुल) काम नहीं किया। मैंने आपकी प्रत्येक पोस्ट में एक टिप्पणी जोड़ी है।

अच्छी खबर: मैंने इसे काम करने का एक तरीका ढूंढ लिया है। यह समाधान बहुत सीधा है और सभी परिदृश्यों में काम करता है (नीचे मूसिंग, पाठ का चयन करना, ध्यान केंद्रित करना, आदि)।

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

जहां तक ​​मैं बता सकता हूं, यह एक टेक्स्टबॉक्स को वेब ब्राउज़र के एड्रेस बार की तरह व्यवहार करने का कारण बनता है।

उम्मीद है कि यह अगले आदमी की मदद करता है जो इस भ्रामक सरल समस्या को हल करने की कोशिश करता है।

धन्यवाद फिर से, दोस्तों, आपके सभी जवाबों के लिए जिसने मुझे सही रास्ते की ओर ले जाने में मदद की।


जब ध्यान केंद्रित होता है तो प्रोग्राम टेक्स्ट बॉक्स पर सेट होता है? मुझे उस समस्या के रूप में यहां चर्चा की गई है: stackoverflow.com/questions/24790704/… मैं इसे हल करने में सक्षम था, एक फैशन के बाद, लेकिन मैं अभी भी इसके बारे में घबरा रहा हूं, जैसा कि मेरा "फिक्स" नहीं बल्कि कीचड़ लगता है।
बी क्ले शैनन

आपने लिखा है, "कॉलिंग .SelectAll () .Enter या .GotFocus इवेंट्स के दौरान काम नहीं करेगा क्योंकि यदि उपयोगकर्ता टेक्स्टबॉक्स पर क्लिक करता है, तो कैरट को रखा जाएगा जहां उसने क्लिक किया है, इस प्रकार सभी टेक्स्ट को हटा दिया गया है।" मेरे पास GotFocus इवेंट में SelectAll है, जो अधिकांश भाग के लिए काम करता है। वास्तव में, मुझे लगता है कि उपयोगकर्ता द्वारा क्लिक किया गया कर्सर रखा जा रहा है "अच्छी बात है।" मैं बस चाहता हूं कि इसे हमेशा चुना जाए जब टेक्स्ट टेक्स्टबॉक्स पर ध्यान केंद्रित किया जाए।
बी क्ले शैनन

और मैं यहाँ फिर से हूँ! :)
डॉटनेट

3
आप alreadyFocused = true;माउसअप को स्टेटमेंट से बाहर ले जाना चाहिए । क्योंकि यदि आप तुरंत पाठ के कुछ हिस्सों का चयन करते हैं, तो अगला क्लिक फिर से पूरे पाठ का चयन करेगा।
राबर्ट एस।

नीचे एक लाइनर उत्तर है --- BeginInvoke ((एक्शन) MyTextBox.SelectAll); --- देखने लायक। यह आवश्यक सब कुछ करने के लिए लगता है
जनरल ग्रे

78

मुझे इसका एक सरल समाधान मिला। इसमें SelectAll को अतुल्यकालिक रूप से उपयोग करते हुए किक करना शामिल है Control.BeginInvokeताकि यह दर्ज होने और क्लिक करने की घटनाओं के बाद घटित हो:

C # में:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

VB.NET में ( कृष्णू डे को धन्यवाद )

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub

5
सबसे स्मार्ट उत्तर मैंने कभी पाया है .. बहुत बहुत धन्यवाद .. VB.net के लिए यहाँ समाधान है .. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
कृष्णू डे

क्लास मच 'बेस्ट सॉल्यूशन, इस तरह के वेब ब्राउजर URL बार, ज्यादा क्लास एंड क्लास
ar.dll

7
.Net 4.0 में आप कर सकते हैं: BeginInvoke ((एक्शन) MyTextBox.SelectAll);
जोएलफैन

2
दुर्भाग्य से, BeginInvoke मेरे लिए काम नहीं करता है (डॉट नेट के मेरे विनाशकारी धूल भरे संस्करण के कारण निस्संदेह)। Prepending "नियंत्रण।" यह मदद नहीं करता है, और न ही TextBox के नाम को प्रस्तुत करता है। अकेले, और ख़ुशी से चहकते हुए ...
बी। क्ले शैनन

2
ध्यान दें, कि यह समाधान ठीक उसी तरह का व्यवहार नहीं करता जैसा कि प्रश्न में वर्णित है। विशेष रूप से Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.वांछित की तरह काम नहीं करता है। लेकिन फिर भी सबसे छोटा और सबसे सुंदर समाधान :)
मार्कस मैंगल्सडॉर्फ

30

आपका समाधान अच्छा है, लेकिन एक विशिष्ट मामले में विफल रहता है। यदि आप टेक्स्टबॉक्स को केवल क्लिक करने के बजाय टेक्स्ट की एक सीमा का चयन करके ध्यान देते हैं, तो पहले से ही चिह्नित ध्वज सत्य पर सेट नहीं होता है, इसलिए जब आप दूसरी बार टेक्स्टबॉक्स में क्लिक करते हैं, तो सभी टेक्स्ट चयनित हो जाते हैं।

यहाँ समाधान का मेरा संस्करण है। मैंने कोड को एक वर्ग में भी रखा है जो टेक्स्टबॉक्स विरासत में मिला है, इसलिए तर्क अच्छी तरह से छिपा हुआ है।

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}

2
कस्टम टेक्स्टबॉक्स सुझाव और पूरी तरह से काम कर रहे समाधान के लिए +1!
ईंधन

भयानक समाधान। अपने कोड को मेरे समाधान में कॉपी किया, निर्दोष की रक्षा के लिए नाम स्थान को बदल दिया, और पूरी तरह से काम किया। धन्यवाद!
केंसदेवदेव २14

8

यह थोडा कडल्जी है, लेकिन आपके क्लिक इवेंट में, उपयोग करें SendKeys.Send( "{HOME}+{END}" );


Woofta! यह हैकरी का एक सा है! :-) सलाह के लिये धन्यवाद। कोई बेहतर विचार?
जुदा गेब्रियल हिमंगो

हैकिंग वास्तव में, लेकिन यह सब बुरा नहीं लगता
टेरी

3
विचार करें कि बहुत सारे एंटी-वायरस प्रोग्राम इंटरसेप्ट करते हैं और SEND KEYS को दुर्भावनापूर्ण बनाते हैं। यह एक महान समाधान नहीं है।
जुदा गेब्रियल हिमंगो

4

टेक्स्टबॉक्स की घटना पर क्लिक करें? या यहां तक ​​कि MouseCaptureChanged इवेंट मेरे लिए काम करता है। - ठीक है। काम नहीं करता है।

तो आपको 2 काम करने होंगे:

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

टैबिंग के लिए काम करता है (पाठ बॉक्स के माध्यम से एक) के रूप में अच्छी तरह से - कॉल SelectAll () बस के मामले में दर्ज करें ...


ठीक है जैकब, जो आंशिक रूप से काम करता है। यदि मैं टेक्स्ट बॉक्स पर टैब करता हूं, तो इसे फोकस करने की आवश्यकता है। क्या वह आपके समाधान के साथ काम करेगा? (यदि आप मुझे दिखा सकते हैं कि कैसे, मैं आपके उत्तर को सही उत्तर के रूप में चिह्नित करूंगा।)
यहूदा गेब्रियल हिमंगो

जैकब, अब जब आपने कोड पोस्ट कर दिया है, तो यह कभी-कभी काम करने लगता है । हर बार नहीं; अभी मैं टेक्स्ट बॉक्स में क्लिक कर रहा हूं और यह सभी का चयन नहीं कर रहा है।
यहूदा गैब्रियल हिमंगो

कभी-कभी मैं पाठ में क्लिक करता हूँ और यह सभी का चयन नहीं करता है। यह किसी भी तरह से है। अगर यह फ़ील्ड सेट नहीं है तो यह क्या होना चाहिए, और फिर SelectAll को कॉल नहीं किया जाता है। यह नहीं देखा है?
यहूदा गैब्रियल हिमंगो सेप

मुझे केवल इतना पता है कि माउस-माउस के कारण आप माउस को स्थानांतरित करते समय (विशेष रूप से विस्तृत अक्षरों पर) धीमी गति से क्लिक कर सकते हैं -> ध्वज को अनसेट करें। आप MouseMove घटना में कोड को हटा सकते हैं, लेकिन से आपको मिल - नियंत्रित करने के लिए tabbgin के बाद और फिर क्लिक करके - reSelectAll - पहली खींचें पर stirng का हिस्सा चयन करने में असमर्थ
जेकब Kotrla

4

एक पंक्ति का उत्तर जो मैं उपयोग करता हूं ... आप खुद को लात मार सकते हैं ...

ईवेंट दर्ज करें:

txtFilter.BeginInvoke (नई विधि Invoker (txtFilter.SelectAll));


1
नहीं, काम नहीं करता है। यह सभी पाठों का चयन करता है, ठीक है, लेकिन यह उपयोगकर्ता को अन्य समस्याओं के बीच पाठ के सिर्फ भाग का चयन करने से भी रोकता है।
जुदा गेब्रियल हिमंगो

क्षमा करें, मुझे आपके द्वारा खोजे जा रहे व्यवहार के बारे में गलतफहमी हुई होगी। दर्ज करने पर यह सभी का चयन करता है, यदि आप इसे क्लिक करते हैं और इसे अपने कर्सर के लिए शुरू से चुनते हैं। मुझे लगता है कि आप मेरे पास जो कुछ भी है उसका उपयोग कर सकते हैं और SelectAll को अपने स्वयं के चुनिंदा तर्क के साथ बदल सकते हैं। Informwire.com/demos/2009-04-14_1248.swf

बहुत अच्छा काम करता है! सबसे पहले बॉक्स पर क्लिक करें; फिर पाठ का चयन करने के लिए क्लिक करें और खींचें।
D_Bester

नोट: यह वेब ब्राउजर के एड्रेस बार की तरह काम नहीं करता है। एक वेब ब्राउजर का एड्रेस बार आपको टेक्स्ट बॉक्स में माउस को ले जाने और ड्रैग / सेलेक्ट करने की अनुमति देता है, तब भी जब टेक्स्ट बॉक्स पर फोकस नहीं होता है। यह समाधान हल नहीं करता है। यदि आप इसके साथ ठीक हैं, तो शांत, लेकिन यह इस प्रश्न की आवश्यकताओं को पूरा नहीं करता है।
जुडाह गेब्रियल हिमंगो

3
'Inside the Enter event
TextBox1.SelectAll();

ठीक है, यहाँ यह कोशिश करने के बाद कि आप क्या चाहते हैं:

  • Enter ईवेंट पर एक ध्वज प्रारंभ करें जो बताता है कि आप एंटर इवेंट में हैं
  • यदि आप ध्वज सेट करते हैं, तो क्लिक करें घटना पर, .SelectAll () कॉल करें और ध्वज को रीसेट करें।
  • माउसवूव इवेंट पर, दर्ज किए गए झंडे को झूठा सेट करें, जो आपको पहले टेक्स्टबॉक्स में प्रवेश किए बिना हाइलाइट पर क्लिक करने की अनुमति देगा।

इसने प्रविष्टि पर सभी पाठ का चयन किया, लेकिन मुझे पाठ के भाग को बाद में हाइलाइट करने की अनुमति दी, या आपको पहले क्लिक पर हाइलाइट करने की अनुमति दी।

अनुरोध द्वारा:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

मेरे लिए, नियंत्रण में टैबिंग सभी पाठ का चयन करती है।


आपका समाधान जैकब के समाधान के समान है। यह क्लिक करने के लिए काम करता है। क्या यह टेक्स्ट बॉक्स पर टैब करने पर काम कर सकता है? (जैसे आपके ब्राउज़र के एड्रेस बार पर
टैब

हाँ यह टैबिंग के लिए भी काम करता है। मैंने एक परीक्षण ऐप लिखा और यह वह तरीका है जिससे मुझे यह काम करना पड़ा।
मैजिककट

टैबिंग के लिए काम नहीं करता है। क्या आप हमें वह कोड दिखा सकते हैं जो टैबिंग के लिए काम कर रहा है?
यहूदा गैब्रियल हिमंगो

3

यहां एक हेल्पर फ़ंक्शन अगले स्तर पर समाधान ले रहा है - विरासत के बिना पुन: उपयोग।

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

इसे उपयोग करने के लिए बस एक टेक्स्टबॉक्स पास करने वाले फ़ंक्शन को कॉल करें और यह आपके लिए सभी गंदे बिट्स का ख्याल रखता है। मेरा सुझाव है कि Form_Load इवेंट में अपने सभी टेक्स्ट बॉक्स वायरिंग करें। आप इस फ़ंक्शन को अपने रूप में रख सकते हैं, या यदि आप मुझे पसंद करते हैं, तो एक उपयोगिता वर्ग में कहीं अधिक पुन: उपयोग के लिए।


2

यह एक WPF / XAML टेक्स्टबॉक्स के लिए काम करता है।

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }

2

यह nzhenry के लोकप्रिय जवाब के समान है , लेकिन मुझे यह आसान लगता है कि उपवर्ग के लिए नहीं होना चाहिए:

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub

1

SelectAll ने मेरे लिए कभी काम नहीं किया।

यह काम।

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;

यह उस स्थिति के लिए जिम्मेदार नहीं है जहां टेक्स्टबॉक्स में टैबिंग फोकस लाता है। यह इस धागे में चर्चा की गई कुछ अन्य समस्याओं को भी प्रदर्शित करता है।
यहूदा गैब्रियल हिमंगो

1

मैं एक भी सरल समाधान मिल गया है:

यह सुनिश्चित करने के लिए कि टेक्स्टबॉक्स पर क्लिक करते समय सभी टेक्स्ट का चयन किया जाता है, सुनिश्चित करें कि क्लिक हैंडलर एंटर हैंडलर को कॉल करता है। अतिरिक्त चर के लिए कोई ज़रूरत नहीं है!

उदाहरण:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }

यह नियंत्रण में टैबिंग के माध्यम से ध्यान केंद्रित करने के लिए काम नहीं करता है, है ना? इसके अलावा, जब आप सभी का चयन किए बिना कुछ पाठ का चयन करना चाहते हैं तो क्या होगा?
जुडाह गेब्रियल हिमंगो

वास्तव में, यह इसमें टैबिंग के साथ काम करता है! मैंने अभी एमएस विज़ुअल सी # 2010 का उपयोग करके एक डमी प्रोजेक्ट में इसका परीक्षण किया। इस समाधान के साथ कष्टप्रद बात यह है कि आप सभी का चयन करके कुछ पाठ का चयन नहीं कर सकते हैं। यदि आप ऐसा करना चाहते हैं, तो किसी भी कोड की आवश्यकता नहीं है, आप अपने माउस का उपयोग कर सकते हैं और इसे चुन सकते हैं (या कीबोर्ड का उपयोग करके)।
पीटर हेमेरीक

और यही कारण है कि यह समाधान प्रस्तुत समस्या का समाधान नहीं करता है: यह ब्राउज़र पता बॉक्स की तरह व्यवहार नहीं करता है, क्योंकि आप सभी पाठ का चयन किए बिना पते के अलग-अलग हिस्सों पर क्लिक नहीं कर सकते हैं।
जुडाह गेब्रियल हिमंगो

ठीक है, मैं देख रहा हूं कि आपका क्या मतलब है। प्रश्न और वेब ब्राउजर के एड्रेस बार उदाहरण का शीर्षक यह नहीं दर्शाता है कि आपको पाठ के कुछ हिस्से का चयन करने में सक्षम होना चाहिए। आपने केवल अपने प्रश्न के अंतिम वाक्य में एक पक्ष के रूप में इसका उल्लेख किया है। सादर।
पीटर हेमरीक

0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}

मैंने अभी-अभी एक रिचटॉक्स के साथ परीक्षण किया है। काम नहीं करता है। टेक्स्टबॉक्स में क्लिक करने से सभी टेक्स्ट का चयन नहीं होता है। (क्योंकि यह माउस पर नीचे गिराया जा रहा है, जब कैरट को कर्सर पर रखा गया है।)
जुदा गेब्रियल हिमंगो

0

दिलचस्प बात है, DropDownStyle के साथ एक कॉम्बो बॉक्स = सरल में आपके द्वारा खोजे जा रहे व्यवहार के बिल्कुल अनुरूप है।

(यदि आप सूची न दिखाने के लिए नियंत्रण की ऊंचाई कम करते हैं - और फिर पिक्सेल के एक जोड़े द्वारा अधिक - कॉम्बो बॉक्स और टेक्स्टबॉक्स के बीच कोई प्रभावी अंतर नहीं है।)


दिलचस्प है, लेकिन मुझे वास्तव में TextBox और RichTextBox पर काम करने के लिए इसकी आवश्यकता है।
जुदा गेब्रियल हिमंगो

0

आप केवल टेक्स्ट बॉक्स के माउसडाउन-ईवेंट का उपयोग क्यों नहीं करते हैं? यह मेरे लिए ठीक काम करता है और एक अतिरिक्त बूलियन की जरूरत नहीं है। बहुत साफ और सरल, उदा .:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

नहींं, इस के साथ कुछ समस्याएं: अगर टेक्स्टबॉक्स में पहले से ही फोकस है, तो हम इस बात का ध्यान नहीं रखते हैं (हम हर माउस को सिलेक्ट नहीं करना चाहते हैं, बस जब टेक्स्टबॉक्स फोकस नहीं करता है), तो आप को सिलेक्ट न करें पाठ का एक भाग, जब पाठ बॉक्सिंग पर ध्यान केंद्रित करने के माध्यम से लाया जाता है तो काम नहीं करता है।
जुडाह गेब्रियल हिमांगो

0

मैंने माउसअप इवेंट के अंदर SelectAll को कॉल किया और यह मेरे लिए ठीक काम किया।

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }

हाँ, अन्य उत्तरों (और टिप्पणियों) को देखें कि यह सभी परिदृश्यों में काम क्यों नहीं करता है।
जूडाह गैब्रियल हिमंगो

मैंने इस समाधान के लिए टैब की जांच नहीं की। मेरी गलती। इशारा करने के लिए धन्यवाद। खुशी है कि अब आपके पास इसका पूरा समाधान है। और यह जानकर भी खुशी हुई कि माउसअप के लिए मेरा सुझाव आपके समाधान में शामिल था।
श्रीजिथ के।

0

बस TextBox या MaskedTextBox से एक वर्ग प्राप्त करें:

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

और इसे अपने रूपों पर उपयोग करें।


यह काम नहीं करता है। यह समझने के लिए कि क्यों, अन्य उत्तरों और टिप्पणियों को देखें।
जुदा गेब्रियल हिमंगो

0

क्या आपने MSDN फोरम "विंडोज फॉर्म्स जनरल" पर सुझाए गए समाधान की कोशिश की है जो कि बस टेक्स्टबॉक्स को उपवर्गित करता है?


मेरा मानना ​​है कि हमने ऐसा प्रयास किया। हालाँकि, मुझे उस समाधान की कमी याद नहीं है।
यहूदा गैब्रियल हिमंगो

0

वास्तव में गॉटफोकस एक सही घटना है (संदेश वास्तव में) जो आप में रुचि रखते हैं, क्योंकि कोई फर्क नहीं पड़ता कि आप कैसे नियंत्रण में आते हैं आप इसे अंततः भी प्राप्त करेंगे। सवाल यह है कि आप SelectAll () को कब कॉल करते हैं।

इसे इस्तेमाल करे:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}

अली, यह काम नहीं करता है। पाठ के बीच में नीचे मूसिंग का प्रयास करें। 1 सेकंड के लिए माउस बटन को दबाए रखें।
यहूदा गैब्रियल हिमांगो

0

एक रूप में टेक्स्टबॉक्स के समूह के लिए:

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}

1
यह ठीक से काम नहीं करता है; अन्य उत्तरों के लिए मेरे उत्तरों को देखें जो सुझाव देते हैं ।SelectAll ()। यह काम नहीं करता है क्योंकि यदि आप पाठ का चयन करने का प्रयास करते समय पाठ बॉक्स में प्रवेश करते हैं, तो यह सभी पाठ का चयन करके आपके पाठ के चयन को तोड़ देता है। आप केवल पाठ का चयन करना चाहते हैं यदि फोकस माउस अप या टेबिंग के माध्यम से टेक्स्टबॉक्स में प्रवेश करता है, लेकिन यदि फोकस माउस के माध्यम से होता है।
जुडाह गेब्रियल हिमांगो

0

मुझे पता है कि यह पहले से ही हल था लेकिन मेरे पास एक सुझाव है जो मुझे लगता है कि वास्तव में सरल है।

माउस अप इवेंट में आपको बस इतना करना है

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

यह मेरे लिए VB.NET में काम करने लगता है (मुझे पता है कि यह एक C # प्रश्न है ... दुख की बात है कि मैं अपनी नौकरी पर VB का उपयोग करने के लिए मजबूर हूं .. और मैं इस मुद्दे पर था, जो मुझे यहां लाया है ... )

मुझे अभी तक इसके साथ कोई समस्या नहीं मिली है .. इस तथ्य को छोड़कर कि यह तुरंत क्लिक पर चयन नहीं करता है, लेकिन मुझे इसके साथ समस्या हो रही थी ...।


1
जब आप फ़ील्ड में टैब करते हैं तो मूल अनुरोध यह काम करना चाहता था।
डॉन किर्कबी

2
हां, यह सभी परिदृश्यों के लिए काम नहीं करता है। यह केवल तब काम करता है जब आप टेक्स्टबॉक्स में क्लिक करते हैं। और फिर भी, यदि ब्राउज़र एड्रेस बार के रूप में व्यवहार नहीं करता है, तो पाठ बॉक्स में चयन पहले से मौजूद है।
जुदा गेब्रियल हिमंगो

0

निम्नलिखित समाधान मेरे लिए काम करता है। मैंने टेक्स्टबॉक्स पाठ को हमेशा चयनित रखने के लिए जोड़ा OnKeyDownऔर OnKeyUpईवेंट ओवरराइड किया।

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}

2
क्या यह आपको टेक्स्ट बॉक्स में माउस डालने की अनुमति देता है, अपने कर्सर को कुछ टेक्स्ट का चयन करने के लिए खींचें, फिर माउस अप करें?
जुडाह गैब्रियल हिमंगो

0

जब आप नियंत्रण छोड़ देते हैं तो सेलेक्शन सेट करें। जब आप वापस आएंगे तो यह वहां होगा। प्रपत्र के चारों ओर टैब और जब आप नियंत्रण पर लौटते हैं, तो सभी पाठ का चयन किया जाएगा।

यदि आप माउस से जाते हैं, तो कैरट को उस बिंदु पर रखा जाएगा जहां आपने क्लिक किया था।

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }

यदि आप माउस से जाते हैं, तो उसे सभी पाठ का चयन करना चाहिए, जब तक कि यह पहले से ही केंद्रित न हो। यह उसका समर्थन नहीं करता है।
जुदा गेब्रियल हिमंगो

0

बहुत ही सरल उपाय:

    private bool _focusing = false;

    protected override void OnEnter( EventArgs e )
    {
        _focusing = true;
        base.OnEnter( e );
    }

    protected override void OnMouseUp( MouseEventArgs mevent )
    {
        base.OnMouseUp( mevent );

        if( _focusing )
        {
            this.SelectAll();
            _focusing = false;
        }
    }

संपादित करें: मूल ओपी विशेष रूप से माउस-डाउन / टेक्स्ट-चयन / माउस-अप अनुक्रम के बारे में चिंतित था, इस मामले में उपरोक्त सरल समाधान पाठ आंशिक रूप से चयनित होने के साथ समाप्त हो जाएगा।

यह समस्या को हल करना चाहिए (व्यवहार में मैं WM_SETCURSOR को रोक देता हूं):

    protected override void WndProc( ref Message m )
    {
        if( m.Msg == 32 ) //WM_SETCURSOR=0x20
        {
              this.SelectAll(); // or your custom logic here                
        }

        base.WndProc( ref m );
    }

* वास्तव में निम्नलिखित अनुक्रम आंशिक पाठ चयन के साथ समाप्त होता है, लेकिन यदि आप पाठ बॉक्स पर माउस ले जाते हैं तो सभी पाठ फिर से चुने जाएंगे:

माउस-डाउन / टेक्स्ट-चयन / माउस-मूव-आउट-टेक्स्टबॉक्स / माउस-अप


यह समाधान पहले से ही पोस्ट किया गया था। मौजूदा जवाब के लिए टिप्पणी देखें कि यह काम क्यों नहीं करता है।
यहूदा गैब्रियल हिमंगो सेप

टैब के साथ और माउस के साथ काम करता है, आप फ़ोकस प्राप्त कर सकते हैं, टेक्स्ट का चयन कर सकते हैं और फिर माउस अप कर सकते हैं। मैं इस मुद्दे को खोजने के लिए प्रतीत नहीं कर सकते। क्या आप कृपया इस ओर इशारा कर सकते हैं?
मौरो सेम्पीटरो

0

मुझे यह काम सबसे अच्छा लगता है, जब माउस क्लिक करता है और तुरंत रिलीज़ नहीं होता है:

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }

0

मेरा समाधान सुंदर आदिम है, लेकिन मेरे उद्देश्य के लिए ठीक काम करता है

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}

तब काम नहीं करता जब आप पाठ का एक गुच्छा चुनने के लिए नीचे माउस ले जाना चाहते हैं, अपने माउस को खींचें, फिर माउस ऊपर ले जाएँ। आपका कोड चयन को साफ़ कर देगा और सब कुछ चुन लेगा।
जुदा गेब्रियल हिमंगो

@ जुदाहिमंगो जप। यदि आप सिंगल क्लिक करते हैं तो यह सब कुछ का चयन करेगा। यदि आप क्लिक करते हैं और खींचें तो यह केवल चयन का चयन करेगा। कम से कम फ़ायरफ़ॉक्स में ब्राउज़रबार बिल्कुल इस व्यवहार को दिखाता है।
ब्लूव्हेल

हालांकि यह एक दौड़ की स्थिति नहीं है? यदि मैं माउस के साथ कुछ पाठ को जल्दी से चुनने का प्रबंधन करता हूं, तो मेरे चयन को अधिलेखित करते हुए .SelectAll () बाद में मिलीसेकंड में आग लगा देगा।
जुदा गेब्रियल हिमंगो

1
ठीक है, अगर आप चीजों को चुनने में तेज हैं तो यह चीज आपके खिलाफ काम करेगी।
ब्लूव्हेल

-1

नीचे काम करने लगता है। प्रवेश घटना नियंत्रण के लिए टैबिंग को संभालती है और नियंत्रण क्लिक होने पर माउसडाउन काम करता है।

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }

कोई भाग्य नहीं, मुझे डर नहीं है। कुछ पाठ का चयन करने का प्रयास करें। .SelectAll पाठ उपयोगकर्ता को चुनने की कोशिश कर रहा है जो ओवरराइट करता है।
जुडाह गेब्रियल हिमंगो सेप

-1

उत्तर वास्तव में उपरोक्त सभी की तुलना में काफी सरल हो सकता है, उदाहरण के लिए (WPF में):

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

निश्चित रूप से मैं नहीं जान सकता कि आप इस कोड का उपयोग कैसे करना चाहते हैं, लेकिन यहाँ देखने के लिए मुख्य भाग है: पहले call.1ocus () और फिर call .SelectAll ();


यह काम नहीं करता है, और अन्य उत्तरों की नकल है। उदाहरण के लिए, यदि आप टेक्स्टबॉक्स में माउस को नीचे खींचते हैं, तो उसे टेक्स्ट का हिस्सा चुनना चाहिए। यह टूट जाता है और सभी का चयन नहीं करता है।
यहूदा गैब्रियल हिमंगो

-1

केवल एंटाल () का उपयोग करें और घटनाओं पर क्लिक करें

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }

वह तब तक काम करता है जब तक आप कुछ पाठ का चयन नहीं करना चाहते। पूर्ण विवरण के लिए अन्य उत्तर देखें।
यहूदा गैब्रियल हिमंगो

-1

मैंने एक नया VB.Net Wpf प्रोजेक्ट बनाया। मैंने एक टेक्स्टबॉक्स बनाया और कोडबेहैंड के लिए निम्नलिखित का उपयोग किया:

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.