2010-05-23 72 views
14

Trong biểu mẫu C#, tôi có một bảng điều khiển neo tất cả các cạnh và bên trong, một hộp văn bản, được neo trên cùng/trái/phải.Tự động điều khiển hộp văn bản theo chiều dọc

Khi văn bản được tải vào hộp văn bản, tôi muốn nó tự động mở rộng theo chiều dọc để tôi không cần cuộn hộp văn bản (cuộn bảng nhiều nhất, nếu có nhiều văn bản không vừa với bảng điều khiển). có cách nào để thực hiện việc này với hộp văn bản không? (Tôi không bị ràng buộc để sử dụng điều khiển này vì vậy nếu có một điều khiển khác phù hợp với mô tả, vui lòng đề cập đến nó)

Trả lời

25

Tôi giả định đây là hộp văn bản nhiều dòng và bạn sẽ cho phép nó phát triển theo chiều dọc. Mã này hoạt động tốt:

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; 
    } 

Bạn nên làm điều gì đó hợp lý khi hộp văn bản trống, như đặt thuộc tính MinimumSize.

+0

hoạt động như một nét duyên dáng –

+0

Nó hoạt động nhưng không xử lý các dòng không có khoảng trống. người David viết tay cầm rằng – docesam

+0

@Hans Passant Nếu đó là một hộp văn bản một dòng thì sao? – 707

2

Bạn có thể sử dụng Nhãn và đặt Tự động hóa thành true.

+1

tôi nghĩ rằng AutoSize là dành cho ngang. Liệu tôi có sai? –

0

Bạn có thể neo nó xuống phía dưới, điều đó sẽ đảm bảo rằng hộp văn bản được thay đổi kích thước theo chiều dọc khi hình thức mà nó thuộc về được thay đổi kích thước. Ngoài ra, một hộp văn bản thay đổi kích thước của nó có thể không phải là một điều thanh lịch vì nó có thể làm gián đoạn cách các thành phần khác được hiển thị. Tại sao bạn không cho nó một kích thước tối đa thay vì có nó thay đổi kích cỡ?

2

Tôi khuyên bạn nên sử dụng Graphics.MeasureString.

Trước tiên, bạn tạo đối tượng Graphics, sau đó gọi MeasureString trên đó, chuyển chuỗi và phông chữ của hộp văn bản.

Ví dụ

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; 
} 

Bạn cũng có thể hạn chế nó với trục thẳng đứng bằng cách thiết lập chỉ textBox.Size.Height sở hữu và sử dụng quá tải MeasureString mà cũng chấp nhận int width.

Sửa

Như SLaks chỉ ra, một lựa chọn khác là sử dụng TextRenderer.MeasureString. Bằng cách này, bạn không cần tạo đối tượng Graphics.

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

Ở đây bạn có thể hạn chế để thay đổi kích thước thẳng đứng sử dụng kỹ thuật Hans', đi qua thêm một tham số Size-MeasureString với int.MaxValue chiều cao.

+1

Bạn quên vứt bỏ 'g'. Bạn nên gọi 'TextRenderer.MeasureString'. – SLaks

25

Câu trả lời được lựa chọn hiện tại không xử lý dòng không có dấu cách chẳng hạn như "jjjjjjjjjjjjjjjjjjjj" x1000 (suy nghĩ về những gì sẽ xảy ra nếu ai đó dán URL)

Mã này giải quyết vấn đề đó:

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

Cái này hoạt động như ma thuật. – docesam

0

Hãy thử phương pháp này:

aspx.cs đang

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; 
} 

đang aspx

<asp:TextBox ID="txtValue" TextMode="MultiLine" Text='<%# Eval("Value") %>' runat="server" MaxLength="500" Width="700px" Rows='<%# GetRows(Eval ("Value")) %>' ></asp:TextBox> 
Các vấn đề liên quan