【发布时间】:2012-02-14 06:35:53
【问题描述】:
我有这个代码:
public static void AddDefaultTextFromTag(params TextBox[] textBoxes)
{
foreach (TextBox oTextBox in textBoxes)
{
bool isPasswordChar = oTextBox.UseSystemPasswordChar;
oTextBox.Enter += (sndr, evnt) =>
{
if (((TextBox)sndr).Text == ((TextBox)sndr).Tag.ToString())
{
((TextBox)sndr).Text = "";
((TextBox)sndr).UseSystemPasswordChar = isPasswordChar;
((TextBox)sndr).ForeColor = SystemColors.WindowText;
}
};
oTextBox.Leave += (sndr, evnt) =>
{
if (((TextBox)sndr).Text.Trim().Count() == 0)
{
((TextBox)sndr).UseSystemPasswordChar = false;
((TextBox)sndr).CharacterCasing = CharacterCasing.Normal;
((TextBox)sndr).Text = ((TextBox)sndr).Tag.ToString();
((TextBox)sndr).ForeColor = SystemColors.GrayText;
}
};
if (oTextBox.Text.Trim().Count() == 0)
{
oTextBox.UseSystemPasswordChar = false;
oTextBox.CharacterCasing = CharacterCasing.Normal;
oTextBox.Text = oTextBox.Tag.ToString();
oTextBox.ForeColor = SystemColors.GrayText;
}
}
}
但是当我在这个方法的参数中输入的TextBox.UseSystemPasswordChar为真且TextBox.Text属性为空时,TextBox不能使用键盘上的Tab按钮离开,只有MouseClick可以习惯于失去那个TextBox的焦点。
为什么会这样?
我的代码在 C#,框架 4,在 VS2010 Pro 中构建,项目在 WinForms 中。 我使用 VS ToolBox 中的 TextBox。
请帮忙。提前致谢。
【问题讨论】:
-
只是一个建议:为什么不创建两个方法(Enter 和 Leave)并将其作为事件处理程序附加到所有文本框,而不是为每个文本框使用自定义委托? (我认为在这种情况下它们不会被重用,但我不确定)您可以在所有这些上运行 Leave 事件处理程序,而不是复制代码。
-
@Joey 匿名方法是绝对重用的。在编译期间,每个匿名方法都被转换为类的实例方法,并且该方法用于事件处理程序。所以别担心:)
-
啊,谢谢 MD.Unicorn。然后可以忽略那部分,只使用减少代码重复的最后一个建议;)