web-dev-qa-db-ja.com

テキストボックスのパディング

インターネットで検索しましたが、何も見つからないため、間違ったキーワードを使用しているに違いありません。左から少し離れたところから始まるテキストを含むテキストボックスを作成します。

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

そのように。

28
dab

ご存知のとおり、Winforms Textboxesにはパディングプロパティがありません。 PanelsはPaddingプロパティを公開するので、1つの手法は次のようになります。

  1. パネルを作成する
  2. テキストボックスに一致するように境界線を設定します(例:Fixed3D)
  3. テキストボックスに一致するように背景色を設定します(例:白またはウィンドウ)
  4. そのパディングを満足のいくものに設定します(例:10,3,10,3)
  5. パネル内にテキストボックスを追加します
  6. テキストボックスの境界線をなしに設定します
  7. TextboxのDockプロパティとAnchorプロパティを操作すると、望ましい効果が得られます

これで始められるはずです。上記と同じことを行うカスタムコントロールを作成することもできます。

Asp.netのTextboxについて話している場合は、CSSを使用してください。
input[type="text"] {padding: 3px 10px}

38
Nimrod

まあ、あなたはTrimLeftをしてから、5つのスペースで連結することができます。または、境界線のないTextBoxを実際のエントリ要素としてカスタムUserControlを設定し、タブストップのない別のTextBoxをオーバーレイして、フォーカスがあると境界線のないTextBoxにフォーカスを移すことができます。

7
KeithS

OK、これが適切な解決策です。まず、TextBoxコントロールのMultilinetrueに設定します。

ステートメントを使用して必要:

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

もちろん、Multilineを自動的にtrueに設定し、テキスト内の不要な改行を停止できる独自のTextBoxコントロールを作成するのが最善です。

6
user990827

この質問はすでに回答を推奨しています。とにかく私は別の答えを出したいと思います。 C#でテキストボックスにパディングを追加するには、「padLeft」メソッドを使用できます。これが誰かに役立つことを願っています。

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

or

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

これは少し古いことを知っています。しかし、これが解決策です。最初のテキストについては、最初にスペースを追加します。次に、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は、埋め込むスペースの数に置き換えることができます。

1
kakkarot

上記の応答と、パディングされた値を介してバックスペースできるという認識された欠点を拡張します。テキストボックスのSelectionStartプロパティを使用して、TextChangedイベントが発生したときにカーソルを配置する場所を決定できます。

この例では、テキストボックスの先頭に2つのスペースが埋め込まれているため、表示される情報は、パディングプロパティが使用されている他の非入力コントロールと整列します。

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