1

我有一个文本框。离开文本框后,第一个字符应该是大写字母。三个事件的工作方式相同。它们是离开、验证和验证。

if (txtLocl.Text.Length > 0)
    txtLocl.Text = txtLocl.Text.Substring(0, 1).ToUpper() + txtLocl.Text.Substring(1); 

我应该使用这 3 个事件中的哪个事件?

4

5 回答 5

3

您可以订阅Control.Leave当控件失去焦点时将触发的事件。最初,我认为 usingControl.LostFocus将是最适合使用的事件,但它无法通过设计器获得,这意味着您需要手动订阅该事件,这在我看来有点丑陋和非常规。

private void inputTextBox_Leave(object sender, EventArgs e)
{
    if (inputTextBox.Text != string.Empty)
    {
        string input = inputTextBox.Text;
        inputTextBox.Text = input.First().ToString(CultureInfo.InvariantCulture).ToUpper() +
                            string.Join(string.Empty, input.Skip(1));
    }
}

你听起来很感兴趣Control.Validating。using 的优点Control.Validating是您可以利用事件处理程序的给定参数;CancelEventArgs并将Cancel属性设置为 true。这将阻止控件失去焦点并强制用户输入有效值。我认为这不适合您的应用程序,因为除了格式化输入之外,您并没有真正验证任何内容。

private void inputTextBox_Validating(object sender, CancelEventArgs e)
{
    if (inputTextBox.Text == string.Empty)
    {
        statusLabel.Text = "The given input is not valid.";
        e.Cancel = true;
    }
}

请记住,当表单关闭时,所有控件随后都会失去焦点并Control.Validating触发事件,这可能会阻止表单关闭,直到所有字段都通过其相关验证检查。如果您发现自己需要避免这种行为,快速搜索将占上风。

于 2013-03-11T11:18:11.357 回答
2

还有许多其他活动。

正如MSDN所说,当您通过使用键盘(TAB、SHIFT+TAB 等)、调用 Select 或 SelectNextControl 方法或将 ContainerControl.ActiveControl 属性设置为当前窗体来更改焦点时,会发生焦点事件按以下顺序:

1) Enter

2) GotFocus

3) Leave

4) Validating

5) Validated

6) LostFocus

当您使用鼠标或调用 Focus 方法更改焦点时,焦点事件按以下顺序发生:

1) Enter

2) GotFocus

3) LostFocus

4) Leave

5) Validating

6) Validated

如果 CausesValidation 属性设置为 false,则会抑制 Validating 和 Validated 事件。

于 2013-07-20T10:15:54.360 回答
0

您可能想要订阅 LostKeyboardFocus 事件(在 WPF 中)或 Leave 事件(在 WF 中)。

于 2013-03-11T11:06:46.747 回答
0

我建议使用 Leave,因为我假设您没有验证该值,而是对其进行格式化。Validating 和 Validated 应分别包含验证代码和验证的后果,IMO。

于 2013-03-11T11:16:57.110 回答
0

textBox1_Leave 适合您。

在此处查看有关文本框的事件和描述>>

http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox_events.aspx

希望它有帮助。

于 2013-03-11T11:05:28.787 回答