2011-02-04 255 views
18

我已經通過互聯網搜索,我必須使用錯誤的關鍵字,因爲我找不到任何東西。我想創建一個文本框,其文本從左側稍遠處開始。文本框填充

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

就這樣。

+10

winforms,webforms,wpf ..? –

+1

簡單的簡·視覺工作室。我的錯。 – dab

+8

這並沒有回答這個問題。這是一個Windows Forms項目,WPF項目(Windows Forms的新替代品)還是一個ASP.Net網站?所有這些都可以通過Visual Studio添加文本框,但它們的工作方式各不相同。 –

回答

33

正如您最有可能發現的,WinForms Textboxes沒有填充屬性。由於面板做暴露出Padding屬性,一個技術將是:

  1. 創建面板
  2. 設置它的邊框搭配一個文本框(例如,Fixed3D)
  3. 設置它的背景色,以匹配一個文本框(例如,白色或窗口)
  4. 設置其填充到您滿意爲止(例如,10,3,10,3)
  5. 添加一個文本框面板
  6. 文本框的邊框設置爲none內
  7. 使用Textbox的Dock和Anchor屬性獲得期望的效果

這應該讓你開始。您也可以創建一個自定義控件,它可以執行與上述相同的操作。

如果您在asp.net談論文本框,只需使用CSS:
input[type="text"] {padding: 3px 10px}

+2

唯一的問題是,對於許多較新的Windows皮膚,TextBox上的Fixed3D看起來與Panel不同。 – KeithS

+1

將面板設置爲具有焦點在文本框中的單擊事件可能是個不錯的主意。由於這個新的填充區域似乎是文本框的一部分,因此如果用戶點擊該文本框,並且永遠不會將注意力集中在文本框上,它可能會將用戶關閉。 –

+0

@AdamPlocher萬一asp.net :) – Adrian

6

那麼,你可以TrimLeft,然後連接5個空格。或者,您可以設置一個帶有無邊界TextBox的自定義UserControl作爲實際的入口元素,覆蓋另一個沒有Tabstop的TextBox,並在聚焦時將焦點移至無邊界的TextBox。

3

這個問題已經推薦的應答了。無論如何,我想提出替代答案。要將填充添加到c#中的文本框中,可以使用「padLeft」方法。希望對某人有幫助。

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

@Christian在這種情況下,您可以使用TextChanged()在每次更改時設置PadLeft,這樣它就無法獲得在它下面。 – C4u

4

好的,這裏是一個合適的解決方案。首先將您的TextBox控件的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)); 

當然,最好是自動創建自己的TextBox控件從而可以將Multiline設置爲true,並停止文本中不需要的換行符等。

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。