फॉर्म प्रदर्शित होने पर टेक्स्टबॉक्स में टेक्स्ट हाइलाइट (चयनित) क्यों होता है?


85

मेरे पास एक फॉर्म है जिसमें TextBoxC # है जिसे मैंने एक स्ट्रिंग में सेट किया है:

textBox.Text = str;

जब फॉर्म प्रदर्शित होता है, तो टेक्सबॉक्स में टेक्स्ट हाइलाइटेड / सिलेक्ट क्यों होता है?


आपका प्रश्न stackoverflow.com/questions/1140250/…
DarenW

क्या आपने इसे हल करने का प्रबंधन किया था? आपने इसे कैसे ठीक किया?
फ्लेचर

@ फ्लेचर: मुझे इसे देखने के लिए अभी तक दौर नहीं मिला है। मैं कुछ दिनों में जवाब दूंगा।
CJ7

आप एक vb.net टैग जोड़ सकते हैं, क्योंकि यह मुद्दा वास्तव में एक ही है और स्वीकृत उत्तर भी मान्य है
एंड्रिया एंटांगेली

टैब ऑर्डर देखने से संबंधित बेनस्मिथ का उत्तर इस तरह के परिदृश्य में बहुत उपयोगी होगा।
समिधा चतुर्भुज

जवाबों:


128

टेक्स्ट बॉक्स में TabIndex0 है और TabStopयह सत्य पर सेट है। इसका मतलब है कि फॉर्म प्रदर्शित होने पर नियंत्रण को ध्यान दिया जाएगा।

आप या तो एक और नियंत्रण दे सकते हैं 0 TabIndex(अगर वहाँ एक है) और टेक्स्ट बॉक्स को एक अलग टैब इंडेक्स (> 0) दें, या TabStopऐसा होने से रोकने के लिए टेक्स्ट बॉक्स के लिए गलत सेट करें।


1
क्या आप निश्चित हैं कि टेक्स्टबॉक्स TabIndex 0 पर सेट है? यह उसके व्यवहार से निकलता है?
26071986

@ 26071986 - ठीक है, मैंने एक त्वरित परीक्षण चलाया। यदि, एक टेक्स्ट बॉक्स और एक बटन के साथ एक फॉर्म पर, मैं टेक्स्ट में बॉक्सर के भीतर टेक्स्ट को बदल देता हूं, जब टेबिन्डेक्स 0 पर सेट हो जाता है, तो टेक्स्ट हाइलाइट होता है। यदि बटन में 0 टैब इंडेक्स है और टेक्स्टबॉक्स टैबइंडेक्स> 0 है, तो टेक्स्ट हाइलाइट नहीं किया गया है।
फ्लेचर

यह वास्तव में TabIndex के साथ करना प्रतीत होता है - केवल मैंने अपने सभी तत्वों टैब इंडेक्स को उचित रूप से बदल दिया (इसलिए मैंने सोचा)। यह पता चलता है कि समूह में टैब सूचक भी होते हैं जिन्हें आपको बदलने के साथ-साथ उनके सभी तत्वों को भी बदलने की आवश्यकता होती है। इसलिए जब तक मैं 1-9 से तत्व टैब सेट करता, एक समूह में अभी भी 0 था, इसलिए उस समूह का टेक्स्ट बॉक्स पहला सक्रिय तत्व बन गया (इसलिए इसकी सामग्री हाइलाइट की गई थी)।
deed02392

1
यह आवश्यक रूप से TabIndex = 0 होने से संबंधित नहीं है, लेकिन यह निश्चित रूप से होता है यदि TextBox के पास प्रपत्र का सबसे छोटा TabIndex है। सत्यापित करने के लिए: टेक्स्ट बॉक्स में TabIndex = 5 सेट करें और फॉर्म के अन्य नियंत्रणों के सभी TabIndexs में 5 से अधिक संख्याएँ सेट करें।
एंड्रिया एंटांगेली

यह तब भी होता है जब आप एक TabControl में एक नया TabPage का चयन करते हैं। वही समाधान काम करता है।
जॉनपैन

44

विंडोज फॉर्म में एक टेक्स्टबॉक्स का डिफ़ॉल्ट व्यवहार सभी पाठ को उजागर करना है यदि यह पहली बार इसमें टैब करके ध्यान केंद्रित करता है, लेकिन यदि इसे क्लिक नहीं किया गया है। हम परावर्तक में देख सकते हैं को देखकर TextBoxकी OnGotFocus()ओवरराइड:

protected override void OnGotFocus(EventArgs e)
{
    base.OnGotFocus(e);
    if (!this.selectionSet)
    {
        this.selectionSet = true;
        if ((this.SelectionLength == 0) && (Control.MouseButtons == MouseButtons.None))
        {
            base.SelectAll();
        }
    }
}

यह ऐसा है यदि वह कथन जो उस व्यवहार का कारण है जो हमें पसंद नहीं है। इसके अलावा, चोट के अपमान को जोड़ने के लिए, Textसंपत्ति का सेटर आँख बंद करके उस selectionSetचर को फिर से सेट करता है, जब भी पाठ फिर से सौंपा जाता है:

public override string Text
{
    get
    {
        return base.Text;
    }
    set
    {
        base.Text = value;
        this.selectionSet = false;
    }
}

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

यदि आप मेरे जैसे हैं और इस व्यवहार को कष्टप्रद और असंगत पाते हैं, तो इस समस्या के दो तरीके हैं।

पहला, और शायद सबसे आसान, केवल फॉर्म पर selectionSetकॉल करके और जब भी परिवर्तन DeselectAll()हो , सेटिंग को ट्रिगर करना है :Load()Text

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    this.textBox2.SelectionStart = this.textBox2.Text.Length;
    this.textBox2.DeselectAll();
}

( DeselectAll()सिर्फ सेट SelectionLengthशून्य करने के लिए। यह वास्तव में है SelectionStartflips कि TextBoxके selectionSetचर। ऊपर मामले में, करने के लिए कॉल DeselectAll()के बाद से हम पाठ के अंत करने के लिए शुरू सेट कर रहे हैं आवश्यक नहीं है। लेकिन हम किसी भी अन्य स्थिति, के लिए सेट करता है, तो जैसे पाठ की शुरुआत, फिर इसे कॉल करना एक अच्छा विचार है।)

अधिक स्थायी तरीका विरासत के माध्यम से वांछित व्यवहार के साथ अपना स्वयं का टेक्स्टबॉक्स बनाना है:

public class NonSelectingTextBox : TextBox
{
    // Base class has a selectionSet property, but its private.
    // We need to shadow with our own variable. If true, this means
    // "don't mess with the selection, the user did it."
    private bool selectionSet;

    protected override void OnGotFocus(EventArgs e)
    {
        bool needToDeselect = false;

        // We don't want to avoid calling the base implementation
        // completely. We mirror the logic that we are trying to avoid;
        // if the base implementation will select all of the text, we
        // set a boolean.
        if (!this.selectionSet)
        {
            this.selectionSet = true;

            if ((this.SelectionLength == 0) && 
                (Control.MouseButtons == MouseButtons.None))
            {
                needToDeselect = true;
            }
        }

        // Call the base implementation
        base.OnGotFocus(e);

        // Did we notice that the text was selected automatically? Let's
        // de-select it and put the caret at the end.
        if (needToDeselect)
        {
            this.SelectionStart = this.Text.Length;
            this.DeselectAll();
        }
    }

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;

            // Update our copy of the variable since the
            // base implementation will have flipped its back.
            this.selectionSet = false;
        }
    }
}

आप शायद फोन न करने का प्रलोभन base.OnGotFocus()देते हैं, लेकिन तब हम बेस Controlक्लास में उपयोगी कार्यक्षमता खो देंगे । और हो सकता है कि आपको selectionSetबकवास के साथ खिलवाड़ न करने का प्रलोभन दिया जाए और ओनगोटफोकस () में हर बार केवल टेक्स्ट को अचयनित किया जाए, लेकिन तब हम उपयोगकर्ता के हाइलाइट को खो देंगे यदि वे मैदान से बाहर और पीछे हट गए।

बदसूरत? आप बेट्चा हो। पर अब जो है वो है।


31

इस प्रश्न के उत्तर ने मुझे एक समान समस्या के साथ बहुत मदद की, लेकिन सरल उत्तर केवल अन्य जटिल सुझावों के साथ संकेत दिया गया है। बस अपना टेक्स्ट सेट SelectionStartकरने के 0बाद सेट करें। समस्या सुलझ गयी!

उदाहरण:

yourtextbox.Text = "asdf";
yourtextbox.SelectionStart = 0;

4

आप अपने प्रपत्र के नियंत्रणों के लिए टैब क्रम भी चुन सकते हैं:

देखें-> टैब ऑर्डर

ध्यान दें कि यह विकल्प केवल "दृश्य" में उपलब्ध है यदि आपके पास फ़ॉर्म डिज़ाइन दृश्य खुला है।

"टैब ऑर्डर" का चयन फॉर्म का एक दृश्य खोलता है जो आपको नियंत्रणों पर क्लिक करके वांछित टैब ऑर्डर चुनने की अनुमति देता है।


1
इससे मुझे बहुत मदद मिली। अगर हम टैब ऑर्डर पर चिंता करते हैं तो वास्तव में टैब इंडेक्स मायने नहीं रखता।
समिधा चतुर्भुज

1

वीएस 2013 के साथ एक टेक्स्ट फील्ड को अनहाइज करने के लिए, इनिट के साथ प्रयास करें:

myTextBox.GotFocus += new System.EventHandler(this.myTextBox_GotFocus);

और विधि जोड़ें:

public void myTextBox_GotFocus(object sender, EventArgs e)
{
    myTextBox.SelectionLength=0;
}

इससे पाठ को रद्द कर दिया जाएगा यदि आपने पहले पाठ बॉक्स को फोकस किया था, तो उसमें कुछ पाठ का चयन किया, उससे दूर चले गए और फिर इसे फिर से ध्यान केंद्रित किया।
स्टीवर्ट

0

मैंने C # पर इसका परीक्षण नहीं किया है, लेकिन मैं C ++ WIN32 संवाद बॉक्स का उपयोग करके उसी समस्या में भाग गया। ऐसा लगता है जैसे आप या FALSEसे लौटकर व्यवहार को बदल सकते हैं । उम्मीद है की यह मदद करेगा।OnInitDialog()WM_INITDIALOG


1
मुझे नहीं लगता कि यह ज्यादा मदद करेगा, क्योंकि विंडोज़ एपीआई विंडफॉर्म के अंदर एनकैप्सुलेटेड है।
नाथन एक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.