8

我有一个 Windows 窗体项目,我想强制用户在按下底部的计算按钮之前在某些字段中输入值。这些字段包括三对单选按钮、五个文本框和一个组合框。所以基本上所有这些字段都需要包含一个值才能执行计算。此外,文本框应包含数字- 任何双精度值。此外,我想为大多数这些文本框设置一个最大值用户不能超过。请让我知道实现这一目标的最简单方法是什么。我没有看到像 ASP.Net 中可用的 Winform 项目的字段验证控件。请注意,我正在使用 .net 3.5。目前,我正在使用消息框将其传达给用户,即每当用户按下计算时,我都会显示消息框,其中提及当前为空的必填字段的名称。

4

6 回答 6

14

我遇到了和你一样的情况,我找到了一个简单的解决方案,或者你可以说这个简单的解决方案可用于 WinForms。WinForms 包含一个控件ErrorProvider,可以帮助我们在必填字段上显示错误。

如何:显示表单验证的错误图标提供了简短的介绍。

ErrorProvider可以按照您想要的方式使用,例如,对于文本框,您可以在TextChanged事件处理程序或任何其他让我们说按钮的事件中使用它,如下所示:

if (!int.TryParse(strNumber, out result))
{
    errorProvider.SetError(tbNumber, "Only Integers are allowed");
}
else
{
    errorProvider.Clear();
}
于 2014-01-27T12:34:07.580 回答
4

你可以试试这个:

private void Calculate_button_Click(object sender, EventArgs e)
{
    RadioButton[] newRadioButtons = { radiobutton1, radiobutton2, radiobutton3 };
    for (int inti = 0; inti < newRadioButtons.Length; inti++)
    {
        if (newRadioButton[inti].Checked == false)
        {
            MessageBox.Show("Please check the radio button");
            newRadioButtons[inti].Focus();
            return;
        }
    }
    TextBox[] newTextBox = { txtbox1, txtbox2, txtbox3, txtbox4, txtbox5 };
    for (int inti = 0; inti < newRadioButtons.Length; inti++)
    {
        if (newTextBox[inti].text == string.Empty)
        {
            MessageBox.Show("Please fill the text box");
            newTextBox[inti].Focus();
            return;
        }
    }
}

您可以遍历控件并查找它们是否已填充,如果未填充,它将显示在消息框中,并且特定控件将被聚焦。

于 2012-11-23T13:12:38.763 回答
4

我想实现所有自定义验证的最简单方法是在按钮单击事件中设置一组 if 条件。

private void Calculate_button_Click(object sender, EventArgs e)
{
    if(textBox1.Text == string.Empty)
    {
        MessageBox.Show("Please enter a value to textBox1!");
        return;
    }
    else if(!radioButton1.Checked && !radioButton2.Checked)
    {
        MessageBox.Show("Please check one radio button!");
        return;
    }
    else if(comboBox1.SelectedIndex == -1)
    {
        MessageBox.Show("Please select a value from comboBox!");
        return;
    }
    else
    {
        // Program logic...
    }
}

以同样的方式,您也可以检查范围。

于 2012-11-23T12:08:18.407 回答
0

尝试使用控件的验证事件并在其中编写所需的任何验证。

这是一个示例,它使用一些 ValidateEmail 函数来检查文本是否是电子邮件地址,如果不匹配则将背景设置为某种(红色?)颜色,并且在匹配之前不允许用户离开控制权。

Private Sub VoucherEmail_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Textbox.Validating
    If Not ValidateEmail(sender.Text) Then
        sender.backcolour = Validation.ErrorBackgrounColor
        e.Cancel = True
    End If
End Sub
于 2012-11-23T11:53:44.317 回答
0

我知道这是一个旧线程。

但我认为它值得回答。

在计算按钮单击功能中添加

if(!this.ValidateChildren())
            {
                return;
            }

并将验证功能添加到您的

编辑

抱歉,这适用于 .NET 4.0 及更高版本

于 2019-09-14T09:28:23.213 回答
-2
'You can try this code----- 
'Function for null validate for particular type of controls in your form
Function NullValidate() As Boolean
    NullValidate = True
    For Each ctrl As Control In Me.Controls
        If TypeOf ctrl Is TextBox Then
            If ctrl.Text = "" Then
                MessageBox.Show("Invalid input for " & ctrl.Name)
                NullValidate = False
               Exit Function
            Else
               NullValidate = True
            End If
         End If
    Next
End Function
'Function for numeric validate for particular type of controls in your form
 Function NumericValidate() As Boolean
     NumericValidate = True
    For Each ctrl As Control In Me.Controls
         If TypeOf ctrl Is TextBox Then
             If NumericValidate = IsNumeric(ctrl.text) Then
                   MessageBox.Show("Invalid input for " & ctrl.Name)
                  NumericValidate = False
                  Exit Function
             Else
                  NumericValidate = True
             End If
         End If
     Next
   End Function

Private Sub cmdCalculate_Click(sender As Object, e As EventArgs) Handles cmdSave.Click
     If NullValidate() = True Then
         If NumericValidate() = True Then
             'your statement is here
         End If
     End If
End Sub
于 2013-12-16T15:28:55.810 回答