文本框填充

时间:2011-02-04 21:23:15

标签: c# .net winforms textbox padding

我通过互联网搜索,我必须使用错误的关键字,因为我找不到任何东西。我想创建一个文本框,其文本从左边开始。

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

就像那样。

6 个答案:

答案 0 :(得分:38)

正如您最有可能发现的那样,Winforms Textboxes没有填充属性。由于Panels确实公开了Padding属性,因此一种技术是:

  1. 创建面板
  2. 设置其边框以匹配文本框(例如,Fixed3D)
  3. 设置其背景颜色以匹配文本框(例如,白色或窗口)
  4. 将其填充设置为您满意的(例如,10,3,10,3)
  5. 在面板中添加文本框
  6. 将文本框的边框设置为无
  7. 使用文本框的Dock和Anchor属性确实可以获得所需的效果
  8. 这应该让你开始。您还可以创建一个与上面提到的相同的自定义控件。

    如果您在asp.net中讨论Textbox,请使用CSS:
    input[type="text"] {padding: 3px 10px}

答案 1 :(得分:7)

好吧,你可以使用TrimLeft,然后连接5个空格。或者,您可以设置一个自定义UserControl,其中无边框TextBox作为实际入口元素,覆盖另一个没有tabstop的TextBox,并在焦点聚焦时将焦点转移到无边框。

答案 2 :(得分:6)

好的,这是一个合适的解决方案。首先将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并在文本等中阻止不需要的换行符。

答案 3 :(得分: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, '*');

答案 4 :(得分:1)

我知道这有点老了。但这是一个解决方案。对于初始文本,请在开头添加空格。然后,您可以覆盖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替换为要填充的空格数。

答案 5 :(得分:0)

扩展了上面的响应,并意识到了能够通过填充值退格的缺点。文本框的SelectionStart属性可用于确定在触发TextChanged事件时将光标放置在何处。

在此示例中,在文本框的开头填充2个空格,以便显示的信息将与使用padding属性的其他非输入控件对齐。

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        int pad = 2;
        int cursorPos = textBox1.SelectionStart;
        textBox1.Text = textBox1.Text.Trim().PadLeft(textBox1.Text.Trim().Length + pad);
        textBox1.SelectionStart = (cursorPos > pad ? cursorPos : pad);
    }