【问题标题】:Password char doesnt work when i try to make my custom TextBox当我尝试制作自定义文本框时,密码字符不起作用
【发布时间】:2018-11-17 21:14:05
【问题描述】:

我制作了一个自定义 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 本身。
有人知道解决办法吗?

【问题讨论】:

    标签: c# class passwords controls custom-controls


    【解决方案1】:

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

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

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

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

    InvalidateSize 方法将需要重新设计,因为调整 Size 成员会触发 TextBoxEx_Resize 处理程序方法,该处理程序方法会再次调用 InvalidateSize 方法,最终导致 StackOverflowException

    最后一件事,也是重要的一件事。根据MSDN...

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

    意味着如果文本框是多行,则文本框 PasswordCharacter 将不会显示

    【讨论】:

      【解决方案2】:

      我要试一试,

      private TextBox textBox = new TextBox();
      
      ...
      
      this.Controls.Add(textBox);
      

      上面好像有问题,

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

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

      【讨论】:

      • 当我删除它时它可以工作,但我不明白为什么......我会接受你的回答
      • @FloRida this.Controls.Add(textBox); 它首先显示在实际自定义文本框的前面
      • @Flo Rida 您还应该考虑重新设计您的课程,并考虑其他答案中指出的内容。首先是TextBoxEx_Resize 事件。您还设置了Location = new Point(1, 1);。确定吗?
      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多