Пароль не работает, когда я пытаюсь сделать свой собственный TextBox - PullRequest
0 голосов
/ 07 июня 2018

Я сделал пользовательский TextBox, чтобы он мог граничить, это прекрасно работает ...
Проблема в том, что я хочу установить PasswordChar на *, и это не работает
Вот мой код:

public  class TextBoxEx : TextBox
{
    // The TextBox
    private TextBox textBox = new TextBox();

    // Border color of the textbox
    private Color borderColor = Color.Gray;

    // Ctor
    public TextBoxEx()
    {
        this.PasswordChar ='*';
        this.Paint += new PaintEventHandler(TextBoxEx_Paint);
        this.Resize += new EventHandler(TextBoxEx_Resize);
        textBox.Multiline = true;
        textBox.BorderStyle = BorderStyle.None;
        this.Controls.Add(textBox);
        this.UseSystemPasswordChar = true;

        InvalidateSize();
    }

    // Exposed properties of the textbox
    public override string Text
    {
        get { return textBox.Text; }
        set { textBox.Text = value; }
    }
    // ... Expose other properties you need...

    // The border color property
    public Color BorderColor
    {
        get { return borderColor; }
        set { borderColor = value; Invalidate(); }
    }

    // Expose the Click event for the texbox
    public event EventHandler TextBoxClick
    {
        add { textBox.Click += value; }
        remove { textBox.Click -= value; }
    }
    // ... Expose other events you need...

    private void TextBoxEx_Resize(object sender, EventArgs e)
    {
        InvalidateSize();
    }
    private void TextBoxEx_Paint(object sender, PaintEventArgs e)
    {
        ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, borderColor, ButtonBorderStyle.Solid);
    }
    private void InvalidateSize()
    {
        textBox.Size = new Size(this.Width - 2, this.Height - 2);
        textBox.Location = new Point(1, 1);
    }
}

Обычно, когда я пытаюсь установить свойства пользовательского элемента управления по умолчанию, он не работает, например, если я задаю

this.ReadOnly=true;

Это тоже не сработает.Так что проблема не в самом PasswordChar.
Кто-нибудь знает решение?

Ответы [ 2 ]

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

Поскольку сам класс наследует класс TextBox, вам не нужно создавать внутреннее текстовое поле.

Имея это в виду, вы можете удалить объявление private TextBox textBox и заменитьссылки на этот член с this, поскольку this является потомком TextBox.

В конструкторе вы также удалите this.Controls.Add(textBox);, поскольку больше нет внутреннего элемента управления для добавления.

Переопределенное свойство Text также может быть удалено, поскольку оно не добавляет функциональности к определению TextBox.

Метод InvalidateSize необходимо будет переработать, так как настройка *Элемент 1018 * запускает метод-обработчик TextBoxEx_Resize, который снова вызывает метод InvalidateSize, что в конечном итоге вызывает StackOverflowException.

Последнее и важное.Согласно MSDN ...

Если для свойства Multiline установлено значение true, установка свойства PasswordChar не имеет визуального эффекта.Если для свойства PasswordChar установлено значение true, действия по вырезанию, копированию и вставке в элементе управления с помощью клавиатуры не могут быть выполнены независимо от того, установлено ли для свойства Multiline значение true или false.

Значениетекстовое поле PasswordCharacter не будет отображаться, если текстовое поле имеет значение Multiline

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

Я собираюсь нанести удар в этом,

private TextBox textBox = new TextBox();

...

this.Controls.Add(textBox);

Выше, кажется, проблема,

Кажется, ваше текстовое поле тени на самом деле то, что отображается,

Если вам нужны теневые свойства на заднем плане (и не зная вашей цели), возможно, лучше всего создать нужные вам свойства.

...