我做了一个自定义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
本身。
有人知道解决方案吗?
答案 0 :(得分:4)
由于类本身继承了TextBox
类,因此您无需创建内部文本框。
考虑到这一点,您可以取出private TextBox textBox
的声明,并用this
替换此成员的引用,因为this
是TextBox
后代。< / 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);
以上似乎是问题,
看来你的影子文本框实际上显示了什么,
如果您需要背景中的阴影属性(并且不知道您的目标),可能最好创建您需要的属性。