Текстовое поле - PullRequest
       49

Текстовое поле

22 голосов
/ 05 февраля 2011

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

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

Просто так.

Ответы [ 6 ]

38 голосов
/ 05 февраля 2011

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

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

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

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

7 голосов
/ 05 февраля 2011

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

6 голосов
/ 09 ноября 2015

ОК, вот правильное решение. Прежде всего установите 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(Handle, EM_SETRECT, 0, ref rc);
}

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

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

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

3 голосов
/ 21 января 2015

На этот вопрос уже есть рекомендуемый ответ.В любом случае я хотел бы поставить альтернативный ответ.Чтобы добавить отступ к текстовому полю в 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 голос
/ 16 февраля 2017

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

0 голосов
/ 07 февраля 2019

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

В этом примере текстовое поле заполняется в начале двумя пробелами, так что отображаемая информация будет совмещена с другими элементами управления без ввода, где используется свойство 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);
    }
...