【问题标题】:Field Validation For An IP AddressIP 地址的字段验证
【发布时间】:2009-04-28 18:22:40
【问题描述】:

我试图阻止用户在 C# 中输入除数字或句点之外的任何内容到特定文本框中。文本框应该包含一个 IP 地址。我让它工作以防止非数字条目,但是我似乎无法让它允许输入句点。我怎样才能做到这一点?

    private void TargetIP_KeyDown(object sender, KeyEventArgs e)
    {
        // Initialize the flag to false.
        nonNumberEntered = false;

        // Determine whether the keystroke is a number from the top of the keyboard.
        if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
        {
            // Determine whether the keystroke is a number from the keypad.
            if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
            {
                // Determine whether the keystroke is a backspace.
                if (e.KeyCode != Keys.Back)
                {
                    nonNumberEntered = true;
                    errorProvider1.SetError(TargetIP, FieldValidationNumbersOnly);
                    // A non-numerical keystroke was pressed.
                    // Set the flag to true and evaluate in KeyPress event.
                }
            }
        }

        //If shift key was pressed, it's not a number.
        if (Control.ModifierKeys == Keys.Shift)
        {
            nonNumberEntered = true;
        }
    }


    private void TargetIP_KeyPress(object sender, KeyPressEventArgs e)
    {
        // Check for the flag being set in the KeyDown event.
        if (nonNumberEntered == true)
        {
            // Stop the character from being entered into the control since it is non-numerical.
            e.Handled = true;
        } 

        else
        {
            errorProvider1.Clear();
        }
    }

【问题讨论】:

  • 您知道 IP 地址可以采用多种形式,而不是您试图让用户输入的形式,对吧?如果没有,请尝试阅读这篇文章(它是关于 perl,但与语言无关,绝对适用):perlmonks.org/?node_id=221512
  • 这种 IP 地址格式的字段验证不必是完美的,只要它只能接受数字和小数点,而拒绝所有其他类型的输入。

标签: c# winforms validation controls keyboard


【解决方案1】:

您应该使用MaskedTextBox 控件而不是普通的TextBox 控件。然后只需将Mask 属性设置为990\.990\.990\.990 即可。

  • 9 个可选数字或空格
  • 0 个必填数字
  • \。转义点

更新

虽然我建议使用MaskedTextBox,但我从来没有(至少我不记得)自己使用过它。现在我只是尝试了一下……好吧,忘记我说的话。我认为这可能是一个简单的解决方案,但它也是一个无法使用的解决方案。

新的、更复杂但更好的建议以及我通常这样做的方式。

  • 创建一个包含四个文本框和三个标签的自定义控件,每个标签之间都有一个点。

  • 分析输入。

    • 只需将控制键传递给控件即可。
    • 如果用户输入点、制表符(将由控件处理)、空格、可能是第四位数字,则移动焦点。
    • 丢弃所有不是数字的东西。
    • 如果数字不在 0 到 255 的范围内,则丢弃该数字。
    • 如果用户删除最后一个数字,则将文本更改为 0。
    • 如果用户输入非零数字,则删除前导零。
  • 向返回输入地址的用户控件添加一个属性。

  • 可能使属性可写并添加事件处理。

【讨论】:

  • 哇,谢谢...现在我这样做的方式似乎很愚蠢。以我使用常规文本框的方式而不是您推荐的方式这样做有什么好处吗?
  • IPv6 地址怎么样?我认为这会变得更加棘手。
  • 是的! MaskedTextBox 是可用性的恐怖。我应该在建议之前尝试过。它有效,但是......它有效。如果您将有很多 IP 地址输入,我真的建议您花时间构建一个智能自定义控件。
  • 好吧,它可能是掩码的动态交换。如果 IPv4 掩码失败,是否切换到 IPv6 掩码?只要确保你不要在面具之间打乒乓球,这可能会奏效。
  • 作为一个小提示,当您转到网络连接、连接属性、TCP/IP 属性时,除了“子网掩码”(例如“IP 地址”或“默认值”)之外的所有内容的验证网关”) 是:(1 到 223 之间).(0 到 255 之间).(0 到 255 之间).(0 到 255 之间)
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2012-07-02
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多