Заполнение текстового поля

Я искал в Интернете, должно быть, я использую неправильные ключевые слова, потому что я ничего не могу найти. Я хочу создать текстовое поле с текстом, начинающимся немного слева.

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

Просто так.


person dab    schedule 04.02.2011    source источник


Ответы (6)


Как вы, скорее всего, заметили, текстовые поля Winforms не имеют свойства заполнения. Поскольку панели предоставляют свойство Padding, одним из способов будет:

  1. Создать панель
  2. Установите его границу в соответствии с текстовым полем (например, Fixed3D)
  3. Установите цвет фона в соответствии с текстовым полем (например, белый или оконный)
  4. Установите отступы по своему усмотрению (например, 10,3,10,3)
  5. Добавить текстовое поле внутри панели
  6. Установите для границы текстового поля значение none
  7. Поиграйте со свойствами Dock и Anchor текстового поля, чтобы добиться желаемого эффекта.

Это должно вас начать. Вы также можете создать настраиваемый элемент управления, который выполняет то же самое, что упоминалось выше.

Если вы говорили о текстовых полях в asp.net, просто используйте CSS:
input[type="text"] {padding: 3px 10px}

person Nimrod    schedule 04.02.2011
comment
Единственная проблема заключается в том, что для многих новых скинов Windows Fixed3D в TextBox выглядит иначе, чем для Panel. - person KeithS; 05.02.2011
comment
Может быть хорошей идеей настроить панель так, чтобы событие щелчка фокусировалось в текстовом поле. Поскольку эта новая область заполнения будет отображаться как часть текстового поля, она может сбить пользователя с толку, если он щелкнет по ней и никогда не переключится на текстовое поле. - person Adam Plocher; 28.06.2014
comment
@AdamPlocher В случае asp.net :) - person Anirudha Gupta; 28.02.2018

Хорошо, вот подходящее решение. Прежде всего установите Multiline элемента управления TextBox на 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(textBox.Handle, EM_SETRECT, 0, ref rc);
}

Теперь звоните так:

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

Конечно, лучше всего создать собственный элемент управления TextBox, который может автоматически устанавливать для Multiline значение true и предотвращать нежелательные разрывы строк в тексте и т. Д.

person user990827    schedule 09.11.2015
comment
Работает ли это решение со стилями текстовых полей Windows 10? В моей установке Windows 10 код в этом ответе не имеет видимого эффекта независимо от выбранного стиля BorderStyle. - person silviubogan; 25.05.2018

Ну, вы можете TrimLeft, а затем объединить с 5 пробелами. Или вы можете настроить настраиваемый UserControl с TextBox без полей в качестве фактического элемента ввода, перекрывая другой TextBox, у которого нет табуляции, и смещает фокус на безграничный, когда он сфокусирован.

person KeithS    schedule 04.02.2011

На этот вопрос уже рекомендован ответ. В любом случае я хотел бы поставить альтернативный ответ. Чтобы добавить отступ в текстовое поле в C #, вы можете использовать метод padLeft. Надеюсь, это кому-то поможет.

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

or

textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5, '*');
person Leo    schedule 21.01.2015
comment
У этого, к сожалению, есть ряд недостатков. Например, можно выполнить возврат через левый отступ. :( - person Christian; 26.04.2015
comment
Я нашел это решение невероятно полезным, так как я использую текстовое поле только для чтения, поэтому обратный интервал не может возникнуть. - person Anya Hope; 04.05.2016
comment
@Christian В этом случае вы можете использовать TextChanged() для установки PadLeft при каждом изменении. Таким образом, он не мог опуститься ниже него. - person C4d; 22.06.2016

Я знаю, что это немного устарело. Но вот выход. Для исходного текста добавьте пробел в начале. Затем вы можете переопределить событие 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 количеством пробелов для заполнения.

person kakkarot    schedule 16.02.2017

Расширение ответа выше и предполагаемый недостаток возможности возврата на пробел через заполненное значение. Свойство SelectionStart текстового поля можно использовать для определения положения курсора при срабатывании события TextChanged.

В этом примере текстовое поле заполняется в начале двумя пробелами, чтобы отображаемая информация была выровнена с другими элементами управления, не относящимися к вводу, где используется свойство заполнения.

    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);
    }
person Galactic    schedule 07.02.2019