मेरे पास एक फॉर्म है जिसमें TextBox
C # है जिसे मैंने एक स्ट्रिंग में सेट किया है:
textBox.Text = str;
जब फॉर्म प्रदर्शित होता है, तो टेक्सबॉक्स में टेक्स्ट हाइलाइटेड / सिलेक्ट क्यों होता है?
मेरे पास एक फॉर्म है जिसमें TextBox
C # है जिसे मैंने एक स्ट्रिंग में सेट किया है:
textBox.Text = str;
जब फॉर्म प्रदर्शित होता है, तो टेक्सबॉक्स में टेक्स्ट हाइलाइटेड / सिलेक्ट क्यों होता है?
जवाबों:
टेक्स्ट बॉक्स में TabIndex
0 है और TabStop
यह सत्य पर सेट है। इसका मतलब है कि फॉर्म प्रदर्शित होने पर नियंत्रण को ध्यान दिया जाएगा।
आप या तो एक और नियंत्रण दे सकते हैं 0 TabIndex
(अगर वहाँ एक है) और टेक्स्ट बॉक्स को एक अलग टैब इंडेक्स (> 0) दें, या TabStop
ऐसा होने से रोकने के लिए टेक्स्ट बॉक्स के लिए गलत सेट करें।
विंडोज फॉर्म में एक टेक्स्टबॉक्स का डिफ़ॉल्ट व्यवहार सभी पाठ को उजागर करना है यदि यह पहली बार इसमें टैब करके ध्यान केंद्रित करता है, लेकिन यदि इसे क्लिक नहीं किया गया है। हम परावर्तक में देख सकते हैं को देखकर 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
शून्य करने के लिए। यह वास्तव में है SelectionStart
flips कि 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
बकवास के साथ खिलवाड़ न करने का प्रलोभन दिया जाए और ओनगोटफोकस () में हर बार केवल टेक्स्ट को अचयनित किया जाए, लेकिन तब हम उपयोगकर्ता के हाइलाइट को खो देंगे यदि वे मैदान से बाहर और पीछे हट गए।
बदसूरत? आप बेट्चा हो। पर अब जो है वो है।
इस प्रश्न के उत्तर ने मुझे एक समान समस्या के साथ बहुत मदद की, लेकिन सरल उत्तर केवल अन्य जटिल सुझावों के साथ संकेत दिया गया है। बस अपना टेक्स्ट सेट SelectionStart
करने के 0
बाद सेट करें। समस्या सुलझ गयी!
उदाहरण:
yourtextbox.Text = "asdf";
yourtextbox.SelectionStart = 0;
आप अपने प्रपत्र के नियंत्रणों के लिए टैब क्रम भी चुन सकते हैं:
देखें-> टैब ऑर्डर
ध्यान दें कि यह विकल्प केवल "दृश्य" में उपलब्ध है यदि आपके पास फ़ॉर्म डिज़ाइन दृश्य खुला है।
"टैब ऑर्डर" का चयन फॉर्म का एक दृश्य खोलता है जो आपको नियंत्रणों पर क्लिक करके वांछित टैब ऑर्डर चुनने की अनुमति देता है।
वीएस 2013 के साथ एक टेक्स्ट फील्ड को अनहाइज करने के लिए, इनिट के साथ प्रयास करें:
myTextBox.GotFocus += new System.EventHandler(this.myTextBox_GotFocus);
और विधि जोड़ें:
public void myTextBox_GotFocus(object sender, EventArgs e)
{
myTextBox.SelectionLength=0;
}
मैंने C # पर इसका परीक्षण नहीं किया है, लेकिन मैं C ++ WIN32 संवाद बॉक्स का उपयोग करके उसी समस्या में भाग गया। ऐसा लगता है जैसे आप या FALSE
से लौटकर व्यवहार को बदल सकते हैं । उम्मीद है की यह मदद करेगा।OnInitDialog()
WM_INITDIALOG