猿问

当我尝试制作自定义文本框时,密码字符不起作用

我做了一个自定义,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它本身。

有人知道解决方案吗?


潇潇雨雨
浏览 246回答 2
2回答

慕婉清6462132

我要尝试一下,private TextBox textBox = new TextBox();...this.Controls.Add(textBox);上面好像有问题看起来你的阴影文本框实际上是什么显示,如果您在后台需要阴影属性(并且不知道您的目标),那么最好创建您需要的属性。

开满天机

由于该类本身继承了TextBox该类,因此您无需创建内部文本框。考虑到这一点,您可以取出 的声明private TextBox textBox,并将对该成员的引用替换为this,因为它this是一个TextBox后代。在构造函数中,您还将删除,this.Controls.Add(textBox);因为不再需要添加内部控件。Text也可以删除覆盖的属性,因为它不会向TextBox定义添加功能。该InvalidateSize方法需要重新设计,因为调整Size成员会触发TextBoxEx_Resize处理程序方法,该InvalidateSize方法再次调用该方法,最终导致StackOverflowException.最后一件事,也是重要的一件事。根据MSDN ...如果Multiline属性设置为 true,则设置 PasswordChar 属性没有视觉效果。当 PasswordChar 属性设置为 true 时,无论 Multiline 属性设置为 true 还是 false,都无法使用键盘在控件中执行剪切、复制和粘贴操作。这意味着如果文本框是多行文本框 PasswordCharacter 将不会显示
随时随地看视频慕课网APP
我要回答