我需要一个文本框,最多可以包含8个字符,可以通过设置
来实现this.textBox1.MaxLength = 8;
但是,有时我的程序会预先输入几个字符(即6)。当呈现给用户时,我希望他能够追加缺失的2,但是不能删除预先输入的6个字符。
我不想拥有像
这样的东西if(!textBox1.Text.Equals(strPreEntered)) throw new Exception(); // Or show a messagebox, or ..
理想情况下,我希望文本框在textBox1.Length == strPreEntered.Length
答案 0 :(得分:1)
你真正想要的是一个标志,指示TextBox是否有预先输入的字符。每当您将预先输入的字符发送到TextBox时,将其设置为true。
然后在TextBox的OnKeyPress事件中,如果KeyCode是退格,则忽略keypress,如果设置了标志。
public class FormTest : Form
{
public FormTest() : base()
{
LimitedTextBox tb = new LimitedTextBox();
this.Controls.Add(tb);
tb.Text = "123456";
tb.MaxLength = 8;
tb.HasPreenteredText = true;
}
}
public class LimitedTextBox : TextBox
{
private int preenteredTextLength = -1;
private bool hasPreenteredText = false;
public bool HasPreenteredText
{
get { return hasPreenteredText; }
set
{
if (value == true)
{ preenteredTextLength = this.TextLength; }
else
{ preenteredTextLength = -1; }
hasPreenteredText = value;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (this.TextLength <= preenteredTextLength && e.KeyChar == '\b')
{ e.Handled = true; } // Causes the KeyPress to be skipped as it was already 'handled'
if (this.SelectionStart < preenteredTextLength) // Prevent user from overwriting/deleting selected text beyond the minimum text length
{ e.Handled = true; }
base.OnKeyPress(e);
}
}
上面的代码有点草率但你当然想要清理它。也许有一个SetPreenteredText()方法来处理在LimitedTextBox控件中设置布尔值并使布尔值私有,你不想用那种东西给调用者带来麻烦。代码按预期工作,并完成您似乎想要的。