【问题标题】:Validating IP in C#在 C# 中验证 IP
【发布时间】:2019-02-23 16:20:19
【问题描述】:

我得到了一个项目,在 Windows 窗体应用程序上制作一个基本的 C# IPv4 地址程序。我们将有 5 个文本框(每个八位字节 4 个,下面的一个多行文本框用于显示 IP 和类)。为了在多行文本框中显示 IP,我需要首先验证所有 4 个文本框中的数字(意味着所有数字必须 >= 0 和

【问题讨论】:

标签: c#


【解决方案1】:

在您的问题中,您写的是“WPF”,但您的屏幕截图显然是 Windows 窗体应用程序,因此我将为 Windows 窗体提供答案。但是,可以轻松修改它以使用 WPF。

虽然您可以单独验证每个文本框,但问题的有趣部分是如何跨多个控件完成验证。在进行验证时,您必须决定当输入既无效又有效时应用程序的行为方式。一个简单而好的方法是根据输入的有效性更新视觉状态。例如,只有在整个输入有效时才能单击按钮。这避免了输入无效的情况,用户单击按钮然后得到一个必须关闭的错误。为了进一步完善这一点,您可以在 UI 中提供有关为什么某些内容无效的提示。

根据您的屏幕截图,我的猜测是您想在大文本框中提供有关验证结果的一些信息。您可以创建方法来根据其他文本框的内容更新此文本框的内容。除了更新大文本框外,此方法还可以启用和禁用按钮等,以实现更真实的场景。

private void UpdateVisualState()
{
    var ipString = $"{textBox1.Text}.{textBox2.Text}.{textBox3.Text}.{textBox4.Text}";
    infoTextBox.Text = IPAddress.TryParse(ipString, out var address)
        ? address.ToString()
        : "(Invalid IP address)";
}

此方法会将textBox1 中的文本转换为textBox4,从中创建一个IP 地址,解析此IP 地址并使用解析的IP 地址或指示该IP 地址的文本更新infoTextBox无效。

现在你要做的就是在每个 IP 地址八位字节文本框中的文本发生变化时调用这个方法:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    UpdateVisualState();
}

对其余三个带有 IP 地址八位字节的文本框执行相同操作。

这是一种验证表单整个状态的非常简单的方法,随着您的用户界面和验证规则变得越来越复杂,您可能会发现它的扩展性不太好。但是,如果可以的话,就开始吧。

要了解更高级的验证方法,您可以阅读User Input Validation in Windows Forms

【讨论】:

    【解决方案2】:

    您可以使用 LostFocus。将TextBox_KeyDown 附加到您要进行验证的所有texbox

    private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var textbox = (TextBox)sender;
        var isNumber = int.TryParse(textbox.Text, out var num);
        if (!isNumber)
        {
            //not validated
            return; 
        }
    
        if (!(num > 0 && num < 256)) 
        {
           //not validated
           return;
        }
    
        //valid 
    }
    
    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // call the LostFocus event to validate the TextBox
            ((TextBox)sender).RaiseEvent(new RoutedEventArgs(TextBox.LostFocusEvent));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2013-07-08
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多