Инициализация свойств в пользовательском элементе управления и создание событий - PullRequest
0 голосов
/ 23 июня 2018

Я создал пользовательский элемент управления PlaceHolderTextBox с некоторыми свойствами.Вот мой код:

class PlaceHolderTextBox:TextBox
{
    public string PlaceHolderText { get; set; }
    public Color PlaceHolderColor { get; set; }
    public Font PlaceHolderFont   { get; set; }
    public Color StandardColor    { get; set; }
    public PlaceHolderTextBox()
    {
        GotFocus    += OnGetFocus;
        LostFocus   += OnLostFocus;
        TextChanged += OnTextChanged;

        Text      = PlaceHolderText;
        ForeColor = PlaceHolderColor;
        Font      = PlaceHolderFont;

    }
    private void OnGetFocus(object sender,EventArgs e)
    {
        if (this.Text == this.PlaceHolderText)
        {
            ForeColor = StandardColor;
            Text = "";
        }
    }
    private void OnLostFocus(object sender, EventArgs e)
    {
        if (this.Text == "")
        {
            ForeColor = PlaceHolderColor;
            Text = PlaceHolderText;
        }
    }
}


В конструкторе я устанавливаю значения:
image

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

1 Ответ

0 голосов
/ 23 июня 2018

Давайте сначала сосредоточимся на проблеме, с которой вы сталкиваетесь.Но убедитесь, что вы прочитали Примечание .

Вот проблема → В конструкторе вы установили текст в значение свойства PlaceHolderText.В это время PlaceHolderText пусто.

Даже если вы установите жестко заданное значение по умолчанию для свойства Text в конструкторе, когда вы перетаскиваете экземпляр пользовательского текстового поля на форму, метод InitializeNewComponent TextBoxDesigner установитText свойство к пустой строке.Если вы закроете и снова откроете конструктор, появится ваш текст.

Примечание. Почему не следует отображать текст-заполнитель, задав свойство Text

Это определенно не очень хорошая идея для реализации функции заполнителя путем установки и сброса свойства Text в событиях GotFocus/LostFocus или Enter/Leave, потому что:

  • У него будут проблемы при использовании привязки данных,это приведет к ошибкам проверки при привязке к свойству или свойствам числа или даты, которые должны иметь определенный формат.
  • При привязке данных, если вы нажмете кнопку Сохранить, значения заполнителей будут сохранены в базе данных нежелательно.
  • Исходя из вашего кода, если пользователь вводит то же значение, которое вы указали для заполнителя, то при потере фокуса вы сбрасываете его на пустое.Это неправильно.

Чтобы иметь местозаполнитель (также известный как подсказка, водяной знак и cue-banner), вы можете использовать одно из следующих решений: функция собственного текстового поля или нестандартный раствор краски .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...