Подтвердить что ты не робот

Как установить первые несколько символов текстового поля WinForms только для чтения?

У меня есть форма с текстовым полем, который используется для ввода URL-адреса. Мне нужно добавить (http://) в качестве предопределенного значения в это текстовое поле и хочу, чтобы он был только для чтения, чтобы пользователь не смог удалить http://, но после него он может писать.

enter image description here

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Вот несколько вариантов:

  • Простым способом является просто создать label вне текстового поля (слева) с этими символами. (простой и понятный для пользователя)

  • Создайте второе текстовое поле для чтения, которое будет использоваться в начале, создайте его так, чтобы оно соответствовало входному и выровняло их рядом друг с другом. Да, вы получите одну пиксельную линию, чтобы разделить их оба, но я думаю, что это добавит к пользовательскому опыту, чтобы было очевидно, что это не для возиться с (я бы лично выбрал эту опцию)

  • Если вам нужен стиль, вы можете перевернуть свой собственный пользовательский элемент управления, который по мере необходимости использует панель, ярлык и текстовое поле с соответствующим набором стилей. (лучший способ получить нужный стиль)

  • Четвертый, более раздражающий способ - обработать одно из ключевых событий (например, KeyDown) в самом текстовом поле. С этим вы можете делать многочисленные проверки и изменять позицию каретки, чтобы заставить ее работать, но поверьте мне, это поможет вам в том, чтобы заставить ее работать отлично! (слишком тяжелая работа, чтобы получить право)

Подводя итог, я думаю, что вариант 2 является лучшим здесь. Конечно, если бы вы использовали WPF, у вас, несомненно, было бы намного больше гибкости в дизайне.

Ответ 2

Рассматривали ли вы размещение метки рядом с ней с помощью "http://" в качестве текста? а затем, принимая вход пользователя, вы можете просто добавить "http://" с вашим текстовым полем. Текст.

Вот еще одна идея:

В каждом обратном пространстве укажите количество символов в текстовом поле. Если он равен == 7, то игнорируйте обратное пространство. Если он больше, проверьте количество символов после пробела. Если количество символов меньше 7, очистите текстовое поле и reset текст.

private void a_keyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)8)
    {
        if (myTextbox.Text.Length == 7)
        // do stuff..
    }
    else if //do stuff...
}

Ответ 3

Вы также можете даже не отображать http://и просто добавить его в код Textbox.Text. Сначала проверьте, чтобы он не начинался с этого.

Чтобы прояснить мое последнее замечание:

string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;

Ответ 4

Что-то вроде этого?

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;

    if (!textBox.Text.StartsWith("http://"))
    {
        textBox.Text = "http://";
        textBox.Select(textBox.Text.Length, 0);

    }
}

Ответ 5

Вместо этого вы можете использовать RichTextBox, это позволяет защитить текст:

    public Form1() {
        InitializeComponent();
        richTextBox1.Text = "http://";
        richTextBox1.SelectAll();
        richTextBox1.SelectionProtected = true;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
        richTextBox1.DetectUrls = false;  // optional
    }

Но, к сожалению, это не сработает, если для свойства Multiline установлено значение False.

Прагматичный способ сделать это с помощью TextBox - это просто вернуть его так, как вы хотите. Также работает с удалением пасты и выделения:

    string protect = "http://";

    private void textBox1_TextChanged(object sender, EventArgs e) {
        if (!textBox1.Text.StartsWith(protect)) {
            textBox1.Text = protect;
            textBox1.SelectionStart = textBox1.Text.Length;
        }
    }

Ответ 6

Примечание. Я неправильно понял вопрос, из-за чего-то я пришел сюда из "HTML" -tag. Но если вы хотите сделать что-то подобное с помощью HTML/CSS, это может быть одним из решений.

Вы можете сделать что-то вроде этого:

<style>
    label.mylabel, input.myinput {
        display:        block;
        float:          left;
        height:         20px;
        margin:         0;
        padding:        10px 5px 0px 5px;
        border:         1px solid #ccc;
        font-size:      11px;
        line-height:    11px;
    }

    label.mylabel {
        border-right:   0;
    }

    input.myinput {
        border-left:    0;
    }
</style>

<label class="mylabel" for="myinput">http://</label>
<input id="myinput" class="myinput" name="myinput" value="">

Таким образом, это имеет два преимущества:

  • он выглядит как одно поле ввода
  • когда пользователь нажимает "http", поле фактической формы будет сфокусировано

И, конечно же, вы должны добавить "http://" вручную после отправки в форме.

Все это имеет один недостаток. Что, если ваш пользователь хочет вставить 'Https://'?:)

Cheers, Philipp

Ответ 7

Если вам нужен подход CSS (в сочетании с фоновым изображением), вы можете попробовать что-то вроде этого:

Enter URL: <input type="text" size="50" class="url" value="www.google.com" />

<style>
  input[type="text"].url {
    background: url(http://s18.postimage.org/4wkjdpidh/http.png) no-repeat left top transparent;
    text-indent: 34px;
  }
</style>

Тогда это просто вопрос добавления http:// назад к входному значению при его обработке.

Ответ 8

Вы можете поместить ярлык только слева в текстовый текст и установить его свойство text в "http://". или вы можете добавить 2 текстовых поля, которые один читается, только другой не только для чтения. и напишите http://в том, что доступно только для чтения.

Ответ 9

Создайте делегат для события keyup (и, возможно, другие, например буфер обмена), и проверьте начало значения.

Ответ 10

$('#myField').bind('keypress', function(event)
{
    if (event.charCode == 0 && event.currentTarget.value.length <= 7)
{
     return false;
}
});