2010-03-09 12 views
6

मेरे पास एकाधिक टेक्स्टबॉक्स वाले सी # विनफॉर्म प्रोग्राम हैं। मैंने प्रत्येक बॉक्स में टेक्स्ट रखने के लिए गुणों का उपयोग किया, जिसमें उपयोगकर्ता को बताया गया कि उनमें क्या मूल्य है। जब भी कोई उपयोगकर्ता उस बॉक्स का चयन करता है तो मैं टेक्स्ट को हाइलाइट करना चाहता हूं। या तो टैबबिंग या माउस क्लिक करें। अगर ऐसा करने का कोई तरीका है कि टेक्स्टबॉक्स में कहीं भी मूल्य क्या है, तो मुझे ऐसा करने की ज़रूरत नहीं है।मैं सी # विनफॉर्म प्रोग्राम में टेक्स्टबॉक्स में टेक्स्ट को हाइलाइट कैसे करूं?

मैंने टेक्स्टबॉक्स की कोशिश की। चयन विधि लेकिन इसका कोई प्रभाव नहीं पड़ा। this के साथ ही।

यहां मेरे कार्यक्रम के Screenshot है।

मेरे कोड:

private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
    { 
     grapplingText1.SelectionStart = 0; 
     grapplingText1.SelectionLength = grapplingText1.Text.Length; 

यह कर देगा, या अधिक की आवश्यकता है?

+0

यदि आपने दो समाधानों की कोशिश की है ... दूसरा * * काम करना चाहिए ... यह कोड में एक बग हो सकता है। क्या आप वास्तव में इस्तेमाल किए गए कोड को प्रदान कर सकते हैं? – Nick

+0

मैंने कोड पोस्ट किया। अगर मुझे आगे बढ़ना पर्याप्त है तो मुझे बताएं। – Slateboard

+0

तो क्या कोई समाधान आपको प्राप्त करने के लिए मदद करता था? – MadBoy

उत्तर

8

आप ToolTip को TextBox पर कैसे निर्दिष्ट करते हैं और उसमें सभी "बात करें कि टेक्स्टबॉक्स किसके लिए है"?

बस & ड्रॉप ToolTip फार्म के अंदर खींचें। और फिर प्रत्येक TextBox गुणों में आपको toolTip1 पर विविध अनुभाग ToolTip में अतिरिक्त प्रविष्टि होनी चाहिए (या यदि आप इसका नाम बदलते हैं तो इसका नाम भी होगा)।

फिर जब उपयोगकर्ता TextBox से अधिक हो जाता है (केवल पढ़ने/अक्षम TextBox टूलटिप्स प्रदर्शित नहीं करता है) और 1 सेकंड टूलटिप के लिए वहां रुक जाता है उचित जानकारी के साथ दिखाना चाहिए।

आप अंततः या और भी बेहतर कर सकते हैं एक Label अगले TextBox से कहा है कि क्या है, लेकिन एक ToolTip होने भी एक अच्छा विचार है कि के माध्यम से उपयोगकर्ता के लिए अधिक जानकारी की व्याख्या करने के लिए है।

वॉटरमार्क के साथ काम करना है ताकि आप, घटनाओं की स्थापना SelectAll आदि की देखभाल आप इसे इस तरह से कर सकता से काफी मदद की जरूरत नहीं है के लिए

। नई watermark.cs फ़ाइल बनाएं और इसे इस कोड से प्रतिस्थापित करें। सुनिश्चित करें कि आपने अपने प्रोग्राम नेमस्पेस से मेल खाने के लिए नेमस्पेस बदल दिया है।

#region 
using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

#endregion 

namespace Watermark { 
    public static class TextBoxWatermarkExtensionMethod { 
     private const uint ECM_FIRST = 0x1500; 
     private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
     public static void SetWatermark(this TextBox textBox, string watermarkText) { 
      SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); 
     } 
    } 
} 
    internal class WatermarkTextBox : TextBox { 
    private const uint ECM_FIRST = 0x1500; 
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
    private string watermarkText; 
    public string WatermarkText { 
     get { return watermarkText; } 
     set { 
      watermarkText = value; 
      SetWatermark(watermarkText); 
     } 
    } 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
    private void SetWatermark(string watermarkText) { 
     SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText); 
    } 
} 

अपने फार्म में आप इसे इस तरह सक्रिय करें:

textBoxYourWhatever.SetWatermark("Text that should display"); 

यह वहाँ के रूप में लंबे TextBox खाली है रहता है। जब उपयोगकर्ता TextBox टेक्स्ट में गायब हो जाते हैं। यह फिर से प्रकट होता है जब TextBox साफ़ किया जाता है (या तो उपयोगकर्ता या स्वचालित रूप से)। किसी विशेष घटनाओं आदि के लिए कोई ज़रूरत नहीं

संपादित करें:

मैं भी आंतरिक वर्ग WaterMarkTextBox जो आप बस नई WaterMarkTexBox कि डिज़ाइनर में उपलब्ध हो जाता है का उपयोग करने का विकल्प देता है जोड़ दिया है। फिर इसे अपने डिजाइनर पर खींचें और छोड़ दें और इसका इस्तेमाल करें। यह सामान्य टेक्स्टबॉक्स की तरह व्यवहार करता है बस आपको अतिरिक्त क्षेत्र WaterMarkText देता है।

मैं अभी भी पहली विधि पसंद करता हूं। आपको फिर से अपने गुई का पुनर्निर्माण नहीं करता है।

+0

+1 मैं आपका उदाहरण रखूंगा, मुझे यह बहुत उपयोगी लगता है =) – Javier

+0

मैंने कोशिश की और मुझे मिली त्रुटि: एक्सटेंशन विधियों को शीर्ष स्तर की स्थैतिक कक्षा में परिभाषित किया जाना चाहिए; TextBoxWatermarkExtensionMethod एक नेस्टेड क्लास है मैं गलत क्या कर रहा हूं? इसके अलावा, .SetWatermark स्वत: पूर्ण पर सूचीबद्ध नहीं है। – Slateboard

+0

मैं अनुमान लगा रहा हूं कि उस त्रुटि से, आपने विस्तार कक्षा को किसी अन्य वर्ग के अंदर रखा है। आप यह नहीं कर सकते यह एक शीर्ष स्तर की कक्षा होना चाहिए। एक बार ऐसा करने के बाद, और यह संकलित हो जाता है, तो SetWatermark IntelliSense में दिखाई देगा। –

7

मुझे लगता है। अगर आप उस टेक्स्ट राशि को जानते हैं जिसे आप चुनना चाहते हैं तो चयन करेगा।

कोशिश करें। चयन करें(); यह आपके लिए काम करना चाहिए

3

आपको अपने नियंत्रण पर ध्यान केंद्रित करने के लिए TextBox.Focus() का उपयोग करने की आवश्यकता है, और यदि स्वचालित रूप से काम नहीं करता है, तो केवल EnterAll() ईवेंट को Enter() ईवेंट पर कॉल करें।

private TextBox1_Enter(object sender, EventArgs e) {  
    TextBoxTextHighlight(sender, null); 
} 

private TextBox2_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

private TextBox3_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

// And so forth... 

private void TextBoxTextHighlight(object sender, EventArgs e) { 
    (sender as TextBox).SelectAll(); 
} 

यह विधि आपको किसी भी TextBoxX_Enter() ईवेंट हैंडलर से कॉल करने की अनुमति देगी।

अन्यथा, आप भी एक नया UserControl बना सकते हैं, जिसे आप सृजन पर चाहते हैं उसे कॉल कर सकते हैं, फिर, जब आप अपनी प्रोजेक्ट में बनाए जाते हैं, कोड संपादित करते हैं और टेक्स्टबॉक्स क्लास द्वारा UserControl क्लास के उत्तराधिकारी को प्रतिस्थापित करते हैं, तो उसके भीतर परिभाषित करें डिफ़ॉल्ट व्यवहार आप विधि SelectAll() को यह कॉल की तरह, दर्ज() घटना पर करना चाहते हैं, और यह आभासी संरक्षित हैं, और निर्माता के भीतर, तुम इतनी तरह ईवेंट हैंडलर सदस्य बन सकते हैं:

public partial class CustomTextBox : TextBox { 
    public CustomTextBox() 
     : base() { 
     this.Enter += new EventHandler(Enter); 
    } 

    protected virtual Enter(object sender, EventArgs e) { 
     this.SelectAll(); 
    } 
} 

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

+0

मैं यह प्रत्येक पाठ बॉक्स के लिए करता हूं? – Slateboard

+0

प्रत्येक टेक्स्टबॉक्स के लिए प्रॉपर्टी विंडो इवेंट लिस्ट से इवेंट एंटर() पर डबल-क्लिक करने से आप टेक्स्टबॉक्स 1_इंटर() इवेंट हैंडलर में कोड की लाइन लिखने और बहुत अधिक प्रयास किए बिना SelectAll() की कार्यक्षमता को प्रसारित करने की अनुमति देंगे। तो हाँ, प्रत्येक टेक्स्टबॉक्स के लिए। –

2

मान लें कि आपका textbox's नाम है 'MyTextBox'

आप फोकस घटना को संभालने के लिए विधि लिख सकते हैं:

private void MyTextBox_GotFocus(object sender, EventArgs e) 
{ 
    MyTextBox.SelectionStart = 0; 
    MyTextBox.SelectionLength = MyTextBox.Text.Length; 
    MyTextBox.Select(); 
} 

तो आपको ईवेंट हैंडलर भी जोड़ने की जरूरत है:

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 

यह काम करना चाहिए ...

संपादित

आप अन्य पाठ बॉक्स के लिए एक ही विधि का उपयोग कर सकते हैं बस ईवेंट हैंडलर जोड़ने: आमतौर पर

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
//... 
+0

क्या यह पहले से दर्ज कोड को प्रतिस्थापित करता है? – Slateboard

+0

हां, कम से कम, मैंने इस कोड के साथ परीक्षण किया है, और यह ठीक काम करता है =) – Javier

+0

मैं अपने वास्तविक टेक्स्टबॉक्स के नाम से mytextbox के सभी उदाहरणों को प्रतिस्थापित करता हूं, है ना? – Slateboard

2

, यदि आप उपयोगकर्ता के लिए व्याख्या करना चाहते हैं क्या में चला जाता है एक टेक्स्टबॉक्स, आप Label सीधे इसके ऊपर नियंत्रण रखते हैं, (या तरफ)।

कभी-कभी, स्क्रीन रीयल-एस्टेट को सहेजने के लिए, आप टेक्स्टबॉक्स के के अंदर टेक्स्ट का विवरण डाल सकते हैं। इसे watermark कहा जाता है।

+0

वैसे पाठ टेक्स्ट वर्तमान में उनके भीतर टेक्स्ट विवरण प्रदर्शित करते हैं, तो क्या वॉटरमार्क द्वारा आपका मतलब है? – Slateboard

+0

वॉटरमार्क एक बिल्टिन टेक्स्ट की तरह है जिसे उपयोगकर्ता को उस टेक्स्टबॉक्स में सामान टाइप करने का प्रयास करने की आवश्यकता नहीं होगी। जब टेक्स्टबॉक्स खाली होता है तो यह हमेशा दिखाई देता है, और जब टेक्स्ट अंदर होता है तो यह चला जाता है। – MadBoy

+0

दाएं। वॉटरमार्क का एक अच्छा उदाहरण स्टैक ओवरफ्लो के ऊपरी दाएं भाग में खोज टेक्स्टबॉक्स है। वॉटरमार्क का नुकसान यह है कि आप यह नहीं बता सकते कि मूल्य भरने के बाद क्या मतलब माना जाता है। अपने स्क्रीनशॉट को देखते हुए, मुझे यह सलाह देना होगा कि आप लेबल नियंत्रणों का उपयोग सीधे लेबल बॉक्स के ऊपर रखते हैं। –

0

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

आप कैसे दिए गए लिंक पर इसे लागू करने के देख सकते हैं: Implementing a tooltip

+0

वॉटरमार्क को लागू करने के तत्काल तरीके से मेरा उत्तर देखें। कार्यान्वित करने और उपयोग करने में आसान। – MadBoy

+0

बहुत बढ़िया, अच्छा काम। –

-1

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

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

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