当我尝试制作自定义TextBox时,密码char不起作用

时间:2018-06-07 20:50:05

标签: c# class passwords controls custom-controls

我做了一个自定义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 :(得分:4)

由于类本身继承了TextBox类,因此您无需创建内部文本框。

考虑到这一点,您可以取出private TextBox textBox的声明,并用this替换此成员的引用,因为thisTextBox后代。< / p>

在构造函数中,您还将删除this.Controls.Add(textBox);,因为不再需要添加内部控件。

也可以删除已覆盖的Text属性,因为它不会为TextBox定义添加功能。

InvalidateSize方法需要重做,因为调整Size成员会触发TextBoxEx_Resize处理程序方法,该方法再次调用InvalidateSize方法,最终导致{ {1}}。

最后一件事,也是一件重要的事情。根据{{​​3}} ...

  

如果MSDN属性设置为true,则设置PasswordChar属性没有视觉效果。当PasswordChar属性设置为true时,无论Multiline属性是设置为true还是false,都无法使用键盘执行控件中的剪切,复制和粘贴操作。

意味着如果文本框是Multiline

,则不会显示文本框PasswordCharacter

答案 1 :(得分:2)

我要去捅这个,

private TextBox textBox = new TextBox();

...

this.Controls.Add(textBox);

以上似乎是问题,

看来你的影子文本框实际上显示了什么,

如果您需要背景中的阴影属性(并且不知道您的目标),可能最好创建您需要的属性。