【问题标题】:TextBox Validation in Visual Studio C#Visual Studio C# 中的文本框验证
【发布时间】:2016-09-03 01:45:50
【问题描述】:

总的来说,我对 Visual Studio 和 C# 还很陌生,但基本上我需要检查文本框的内容是否有效,然后再继续使用按钮将内容添加到列表中。

我正在使用以下对象: 用于输入值的 TexBox 链接到 TextBox 以验证数据的 Validating 事件。 一个按钮来采取行动 与按钮关联的 Click 事件。

问题是我无法检查框中的值是否有效并阻止按钮中的单击事件发生。换句话说,如果内容无效,则不要采取行动。

这是我的代码。

public partial class mainForm : Form
{
    public mainForm()
    {
        InitializeComponent();
    }

    private void addButton_Click(object sender, EventArgs e)
    {
        // I need to check if the content is valid before adding it to the form
        ListViewItem item = new ListViewItem(this.nameTextBox.Text);
        this.listView1.Items.Add(item);
    }

    private void nameTextBox_Validating(object sender, CancelEventArgs e)
    {
        int maxCharacters = 15;
        String err = "";
        String contents = this.nameTextBox.Text;

        if (contents.Length == 0)
        {
            err = "I am sorry but the name cannot be empty";
            e.Cancel = true;
        }
        else if (!contents.Replace(" ", "").Equals(contents, StringComparison.OrdinalIgnoreCase))
        {
            err = "I am sorry but the name cannot contain spaces";
            e.Cancel = true;
        }
        else if (contents.Length > 15)
        {
            err = "I am sorry, but the name cannot have more than " + maxCharacters + " characters";
            e.Cancel = true;
        }

        this.mainFormErrorProvider.SetError(this.nameTextBox, err);
    }
}

【问题讨论】:

  • 你没有意义..当你点击按钮是你想要调用验证事件的时候..或者你可以在该文本框的离开事件上执行它,这里有几个选项..

标签: c# visual-studio validation c#-4.0 visual-c++


【解决方案1】:

您对何时调用“名称”文本框的验证方法感到困惑。

here

当您通过使用键盘(TAB、SHIFT+TAB 等)、调用 Selector SelectNextControl 方法或将 ContainerControl.ActiveControl 属性设置为当前窗体来更改焦点时,焦点事件发生在以下情况订购...

所以点击按钮与文本框的验证无关

您需要做的是将验证逻辑放在一个单独的方法中,然后从两个事件中调用它

另外,由于您是 C# 新手,这里有一些建议。

命名空间、类、方法和属性应该是Pascal Case

而不是像这样使用冗长的工作

!contents.Replace(" ", "").Equals(nameText, StringComparison.OrdinalIgnoreCase)

你可以简单地使用

contents.Contains(" ")

像这样的有用方法有,所以将来你应该在自己实现某些东西之前对你需要的东西做更多的研究,特别是如果它看起来像是一种常用的技术。 p>

此外,您希望尽可能避免 if/else 的情况,以便尽早返回。

考虑到更好的实践,这就是您的课程可能看起来的样子

const int NAME_MAX_CHARACTERS = 15;

public mainForm()
{
    InitializeComponent();
}

private void addButton_Click(object sender, EventArgs e)
{
    if(!Validate())
    {
        return;
    }

    // I need to check if the content is valid before adding it to the form
    ListViewItem item = new ListViewItem(this.nameTextBox.Text);
    this.listView1.Items.Add(item);
}

private void nameTextBox_Validating(object sender, CancelEventArgs e)
{
    e.Cancel = !Validate();
}

private bool Validate()
{
    string nameText = nameTextBox.Text;

    if(String.IsNullOrEmpty(nameText))
    {
        this.mainFormErrorProvider.SetError(this.nameTextBox, "I am sorry but the name cannot be empty");
        return false;
    }

    if(nameText.Contains(" "))
    {
        this.mainFormErrorProvider.SetError(this.nameTextBox, "I am sorry but the name cannot contain spaces");
        return false;
    }

    if (nameText.Length > 15)
    {
        this.mainFormErrorProvider.SetError(this.nameTextBox, "I am sorry, but the name cannot have more than " + NAME_MAX_CHARACTERS + " characters");
        return false;
    }

    return true;
}

【讨论】:

  • 非常感谢您的回复。我做了所有的改变,现在它正在工作。我虽然在这两个事件中都进行了验证,但由于某种原因,尽管它们以某种方式链接(HTML 表单验证样式),但我还将所有控件和方法都更改为 Pascal Nonation :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多