2011-02-04 48 views
18

Tôi đã tìm kiếm qua internet, tôi phải sử dụng từ khóa sai vì tôi không thể tìm thấy bất kỳ thứ gì. Tôi muốn tạo một hộp văn bản có văn bản bắt đầu từ một chút xa trái.Chèn hộp văn bản

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

Cứ như thế.

+10

winforms, biểu mẫu web, wpf ..? –

+1

Chỉ đơn giản là Jane Visual Studio. Lỗi của tôi. – dab

+8

Điều đó không trả lời được câu hỏi. Đây có phải là dự án Windows Forms, một dự án WPF (thay thế mới cho Windows Forms) hay một trang web ASP.Net không? Tất cả đều có hộp văn bản có thể được thêm vào thông qua Visual Studio, nhưng tất cả đều hoạt động khác nhau. –

Trả lời

33

Như bạn có nhiều khả năng được phát hiện, hộp văn bản Winforms không có thuộc tính đệm. Kể từ Panels làm lộ một tài sản Padding, một kỹ thuật sẽ được:

  1. Tạo một Panel
  2. Đặt đường viền của nó để phù hợp với một Textbox (ví dụ, Fixed3D)
  3. Đặt màu nền của mình cho phù hợp với một Textbox (ví dụ, trắng hoặc Window)
  4. Đặt đệm của nó đến sự hài lòng của bạn (ví dụ, 10,3,10,3)
  5. Thêm một Textbox bên trong bảng điều khiển
  6. Đặt đường viền của Textbox không ai sánh kịp
  7. Chơi với các thuộc tính Dock và Anchor của Textbox để có được hiệu ứng mong muốn

Điều này sẽ giúp bạn bắt đầu. Bạn cũng có thể tạo một điều khiển tùy chỉnh thực hiện điều tương tự như đã đề cập ở trên.

Trong trường hợp bạn đã nói về Hộp để trong asp.net, chỉ cần sử dụng CSS:
input[type="text"] {padding: 3px 10px}

+2

Chỉ có vấn đề là đối với nhiều giao diện Windows mới hơn, Fixed3D trên TextBox trông khác với Bảng điều khiển. – KeithS

+1

Có thể là một ý tưởng hay khi đặt bảng điều khiển của bạn để có sự kiện nhấp tập trung vào hộp văn bản. Vì khu vực đệm mới này sẽ xuất hiện là một phần của hộp văn bản, nó có thể khiến người dùng tắt nếu họ nhấp vào đó và không bao giờ lấy tiêu điểm trên hộp văn bản. –

+0

@AdamPlocher Trong trường hợp asp.net :) – Adrian

6

Vâng, bạn có thể TrimLeft, sau đó nối với 5 dấu cách. Hoặc, bạn có thể thiết lập UserControl tùy chỉnh bằng một TextBox không biên giới làm phần tử nhập thực tế, chồng lên một Hộp văn bản khác không có tabstop và sẽ chuyển tiêu điểm sang vùng không viền khi tập trung.

3

Câu hỏi này đã đề nghị câu trả lời rồi. Dù sao tôi muốn đặt câu trả lời thay thế. Để thêm đệm vào hộp văn bản trong C#, bạn có thể sử dụng phương thức "padLeft". Hy vọng điều này giúp đỡ một ai đó.

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

or 

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

Điều này, thật không may, có một số hạn chế xấu. Ví dụ, người ta có thể backspace thông qua padding bên trái. :( – Christian

+2

Tôi thấy giải pháp này cực kỳ hữu ích khi tôi đang sử dụng một hộp văn bản chỉ đọc để không gian quay trở lại không thể xảy ra –

+1

@Christian Trong trường hợp này, bạn có thể sử dụng 'TextChanged()' để đặt 'PadLeft' trên mọi thay đổi. bên dưới nó. – C4u

4

OK, đây là giải pháp thích hợp. Trước hết, hãy đặt Multiline điều khiển Hộp văn bản của bạn thành true.

cần thiết sử dụng báo cáo:

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

Code:

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

Bây giờ gọi như vậy:

SetPadding(myTextBox, new Padding(5, 5, 5, 5)); 

Tất nhiên, tốt nhất là để tạo điều khiển TextBox của riêng bạn mà có thể tự động đặt Multiline thành true và dừng ngắt dòng không mong muốn trong văn bản, v.v.

0

Tôi biết điều này hơi cũ. Nhưng đây là một giải pháp. Đối với văn bản ban đầu, hãy thêm dấu cách ở đầu. Sau đó, bạn có thể ghi đè sự kiện OnKeyPress và thêm mã sau để bạn không thể lùi lại.

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

Bạn có thể thay thế số 1 bằng số khoảng trắng.

Các vấn đề liên quan