2011-02-04 18 views
18

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

http://dab.biz/images/screenie/2011-02-04_1316.png

बस ऐसे ही

+10

Winforms, webforms, wpf ..? –

+1

बस सादा जेन विजुअल स्टूडियो। मेरी गलती। – dab

+8

जो सवाल का उत्तर नहीं देता है। क्या यह एक विंडोज फॉर्म प्रोजेक्ट है, एक डब्ल्यूपीएफ प्रोजेक्ट (विंडोज फॉर्म के लिए नया प्रतिस्थापन), या एएसपी.Net वेबसाइट? इनमें से सभी में टेक्स्टबॉक्स हैं जिन्हें विजुअल स्टूडियो के माध्यम से जोड़ा जा सकता है, लेकिन वे सभी अलग-अलग काम करते हैं। –

उत्तर

33

जैसा कि आपने सबसे अधिक संभावना खोज की है, Winforms Textboxes में पैडिंग प्रॉपर्टी नहीं है। चूंकि पैनलों एक पैडिंग संपत्ति का खुलासा करते हैं, एक तकनीक होगा:

  1. एक पैनल
  2. अपनी सीमा एक पाठ बॉक्स मैच के लिए (जैसे, Fixed3D)
  3. अपनी पृष्ठभूमि का रंग एक पाठ बॉक्स मैच के लिए (सेट सेट बनाएं जैसे, सफेद या विंडो)
  4. , अपनी संतुष्टि (जैसे करने के लिए अपनी गद्दी सेट 10,3,10,3)
  5. पैनल
  6. किसी से पाठ बॉक्स के बॉर्डर सेट के अंदर एक पाठ बॉक्स जोड़ें
  7. टेक्स्टबॉक्स के डॉक और एंकर गुणों के साथ खेलो वांछित प्रभाव प्राप्त करें

यह आपको प्रारंभ करना चाहिए। आप एक कस्टम नियंत्रण भी बना सकते हैं जो ऊपर वर्णित वही काम करता है।
input[type="text"] {padding: 3px 10px}

+2

केवल समस्या यह है कि कई नई विंडोज स्किन्स के लिए, टेक्स्टबॉक्स पर फिक्स्ड 3 डी एक पैनल के मुकाबले अलग दिखता है। – KeithS

+1

टेक्स्ट पैनल में केंद्रित एक क्लिक ईवेंट रखने के लिए अपने पैनल को सेट करना एक अच्छा विचार हो सकता है। चूंकि यह नया पैडिंग क्षेत्र टेक्स्टबॉक्स का हिस्सा प्रतीत होता है, इसलिए उपयोगकर्ता इसे बंद कर सकता है अगर वे इसे क्लिक करते हैं और कभी भी टेक्स्टबॉक्स पर फ़ोकस नहीं करते हैं। –

+0

@AdamPlocher asp.net के मामले में :) – Adrian

6

ठीक है, आप ट्रिमलफ्ट कर सकते हैं, फिर 5 रिक्त स्थान के साथ संयोजित कर सकते हैं। या, आप कस्टम एंट्री तत्व के रूप में एक सीमा रहित टेक्स्टबॉक्स के साथ एक कस्टम UserControl स्थापित कर सकते हैं, एक और टेक्स्टबॉक्स को ओवरले कर रहे हैं जिसमें टैबस्टॉप नहीं है और जब यह केंद्रित है तो सीमाहीन को फोकस कर देगा।

3

इस सवाल की सिफारिश की है जवाब पहले से ही:

मामले में आप asp.net में बक्सें के बारे में बात कर रहे थे, बस सीएसएस का उपयोग करें। वैसे भी मैं वैकल्पिक जवाब देना चाहता हूं। सी # में टेक्स्टबॉक्स में पैडिंग जोड़ने के लिए, आप "पैडलफ्ट" विधि का उपयोग कर सकते हैं। किसी को यह मदद आशा है।

textBox1.Text = "Hello"; 
textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5); 

or 

textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5, '*'); 
+1

दुर्भाग्यवश, इसमें कुछ खराब कमीएं हैं। उदाहरण के लिए, कोई बाएं पैडिंग के माध्यम से बैकस्पेस कर सकता है। :( – Christian

+2

मुझे यह समाधान अविश्वसनीय रूप से उपयोगी पाया गया क्योंकि मैं एक पठनीय टेक्स्टबॉक्स का उपयोग कर रहा हूं, इसलिए बैकस्पेसिंग नहीं हो सकता है। –

+1

@ क्रिस्टियन इस मामले में आप प्रत्येक परिवर्तन पर 'पैडलेफ्ट' सेट करने के लिए 'TextChanged() 'का उपयोग कर सकते हैं। इस तरह यह नहीं मिल सका इसके नीचे। – C4u

4

ठीक है, यहां एक उचित समाधान है। सबसे पहले Multiline अपने टेक्स्टबॉक्स नियंत्रण के true पर सेट करें।

की आवश्यकता का उपयोग कर बयान:

using System.Drawing; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

कोड:

private const int EM_SETRECT = 0xB3; 

[DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)] 
private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect); 

[StructLayout(LayoutKind.Sequential)] 
private struct RECT 
{ 
    public readonly int Left; 
    public readonly int Top; 
    public readonly int Right; 
    public readonly int Bottom; 

    private RECT(int left, int top, int right, int bottom) 
    { 
     Left = left; 
     Top = top; 
     Right = right; 
     Bottom = bottom; 
    } 

    public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom) 
    { 
    } 
} 

public void SetPadding(TextBox textBox, Padding padding) 
{ 
    var rect = new Rectangle(padding.Left, padding.Top, textBox.ClientSize.Width - padding.Left - padding.Right, textBox.ClientSize.Height - padding.Top - padding.Bottom); 
    RECT rc = new RECT(rect); 
    SendMessageRefRect(Handle, EM_SETRECT, 0, ref rc); 
} 

अब तो जैसे फोन:

SetPadding(myTextBox, new Padding(5, 5, 5, 5)); 
बेशक

, सबसे अच्छा स्वचालित रूप से अपने स्वयं के पाठ बॉक्स नियंत्रण जो कर सकते हैं बनाने के लिए है Multiline को सत्य में खोलें और अवांछित लाइनों को टेक्स्ट आदि में बंद करें ..

0

मुझे पता है कि यह थोड़ा पुराना है। लेकिन यहां एक समाधान है। प्रारंभिक पाठ के लिए, शुरुआत में एक जगह जोड़ें। फिर, आप OnKeyPress ईवेंट ओवरराइड कर सकते हैं और निम्न कोड जोड़ सकते हैं ताकि आप बैकस्पेस नहीं कर सकें।

protected override void OnKeyPress (KeyPressEventArgs e) { 
    base.OnKeyPress (e); 
    if (e.KeyChar == (char)Keys.Back && Text.Length == 1) e.Handled = true; 
    else e.Handled = true; 
} 

आप 1 को रिक्त स्थान पर पैड में प्रतिस्थापित कर सकते हैं।

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