2010-05-23 13 views
14

एक सी # फॉर्म में, मेरे पास एक पैनल है, और अंदर, एक टेक्स्टबॉक्स, एंकर टॉप/बाएं/दाएं।टेक्स्टबॉक्स नियंत्रण को लंबवत

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

उत्तर

25

मुझे लगता है कि यह एक बहु-पंक्ति टेक्स्ट बॉक्स है और आप इसे लंबवत रूप से बढ़ने की अनुमति देंगे। इस कोड को अच्छी तरह से काम:

private void textBox1_TextChanged(object sender, EventArgs e) { 
     Size sz = new Size(textBox1.ClientSize.Width, int.MaxValue); 
     TextFormatFlags flags = TextFormatFlags.WordBreak; 
     int padding = 3; 
     int borders = textBox1.Height - textBox1.ClientSize.Height; 
     sz = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, sz, flags); 
     int h = sz.Height + borders + padding; 
     if (textBox1.Top + h > this.ClientSize.Height - 10) { 
      h = this.ClientSize.Height - 10 - textBox1.Top; 
     } 
     textBox1.Height = h; 
    } 

आप जब पाठ बॉक्स खाली है, MinimumSize संपत्ति की स्थापना की तरह कुछ उचित करना चाहिए।

+0

एक आकर्षण की तरह काम करता है –

+0

यह काम करता है लेकिन बिना किसी रिक्त स्थान वाली लाइनों को संभालता है। एक डेविड ने लिखा है कि – docesam

+0

@ हंस पासेंट क्या होगा यदि यह एक सिंगल-लाइन टेक्स्टबॉक्स है? – 707

2

आप लेबल का उपयोग कर सकते हैं और true पर ऑटोसाइज सेट कर सकते हैं।

+1

मुझे लगता है कि AutoSize क्षैतिज के लिए है। क्या मै गलत हु? –

0

आप इसे नीचे तक एंकर कर सकते हैं, जिससे यह सुनिश्चित हो जाएगा कि टेक्स्टबॉक्स को लंबवत रूप से आकार दिया गया है जब कभी भी जिस रूप में इसका संबंध बदलता है उसका आकार बदल जाता है। इसके अलावा, एक टेक्स्टबॉक्स जो इसके आकार को बदलता है वह एक सुंदर चीज़ नहीं हो सकता है क्योंकि यह अन्य घटकों को प्रदर्शित करने के तरीके को बाधित कर सकता है। आप इसका आकार बदलने के बजाय अधिकतम आकार क्यों नहीं देते?

2

मैं Graphics.MeasureString का उपयोग करने का सुझाव दूंगा।

सबसे पहले आप Graphics ऑब्जेक्ट बनाते हैं, फिर स्ट्रिंग और टेक्स्टबॉक्स के फ़ॉन्ट को पार करते हुए MeasureString पर कॉल करें।

उदाहरण

string text = "TestingTesting\nTestingTesting\nTestingTesting\nTestingTesting\n"; 

// Create the graphics object. 
using (Graphics g = textBox.CreateGraphics()) {   
    // Set the control's size to the string's size. 
    textBox.Size = g.MeasureString(text, textBox.Font).ToSize(); 
    textBox.Text = text; 
} 

आप भी इसे ऊर्ध्वाधर अक्ष के लिए एक ही textBox.Size.Height संपत्ति की स्थापना और MeasureString अधिभार जो भी int width स्वीकार करता है का उपयोग करके सीमित हो सकती है।

संपादित

रूप SLaks ने कहा, एक और विकल्प TextRenderer.MeasureString उपयोग कर रहा है। इस तरह Graphics ऑब्जेक्ट बनाने की कोई आवश्यकता नहीं है।

textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize(); 

यहाँ आप हंस 'तकनीक का उपयोग कर खड़ी आकार बदलने के लिए सीमित हो सकती है, int.MaxValue ऊंचाई के साथ MeasureString के लिए एक अतिरिक्त Size पैरामीटर गुजर।

+1

आप 'जी' का निपटान करना भूल गए। आपको 'TextRenderer.MeasureString' को कॉल करना चाहिए। – SLaks

25

वर्तमान चयनित जवाब इस तरह के "jjjjjjjjjjjjjjjjjjjj" x1000 के रूप में कोई रिक्त स्थान के साथ लाइनों

इस कोड (अगर कोई एक यूआरएल चिपकाया क्या होगा के बारे में सोचना) संभाल नहीं है कि समस्या का हल:

private void txtBody_TextChanged(object sender, EventArgs e) 
{ 
    // amount of padding to add 
    const int padding = 3; 
    // get number of lines (first line is 0, so add 1) 
    int numLines = this.txtBody.GetLineFromCharIndex(this.txtBody.TextLength) + 1; 
    // get border thickness 
    int border = this.txtBody.Height - this.txtBody.ClientSize.Height; 
    // set height (height of one line * number of lines + spacing) 
    this.txtBody.Height = this.txtBody.Font.Height * numLines + padding + border; 
} 
+0

यह एक जादू की तरह काम किया। – docesam

0

इस दृष्टिकोण को आजमाएं:

एएसपीएक्स।सीएस कोड

protected int GetRows(object value) { 
     if (value == null || string.IsNullOrWhiteSpace(value.ToString())) 
      return 1; 

     var contentTrimmed = value.ToString().Replace('\t', ' ').Replace('\r', ' ').Replace('\n', ' ').Trim(); 

     var length = (decimal)contentTrimmed.Length; 
     if (length == 0) 
      return 1; 

     int res = 0; 
     decimal maxLength = 56; 
     using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(new Bitmap(1, 1))) 
     { 
      SizeF sizeRef = graphics.MeasureString("W", new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel)); 
      maxLength = maxLength * (decimal)sizeRef.Width; 

      SizeF size = graphics.MeasureString(contentTrimmed, new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel)); 
      length = (decimal)size.Width; 
     } 

     res = (int)Math.Round(length/(decimal)maxLength, MidpointRounding.AwayFromZero); 
     if (res == 0) 
      return 1; 

     return res; 
} 

aspx कोड

<asp:TextBox ID="txtValue" TextMode="MultiLine" Text='<%# Eval("Value") %>' runat="server" MaxLength="500" Width="700px" Rows='<%# GetRows(Eval ("Value")) %>' ></asp:TextBox> 
संबंधित मुद्दे