3

我在我的代码中调用三个函数,我想验证我的一些字段。当我尝试使用下面给出的代码时。它只检查第一个值,直到它得到错误的结果。

我想要这样的东西,如果第一个函数返回 true 那么它也应该调用下一个函数等等。可以使用什么来代替 Or 运算符来执行此操作。

    if (IsFieldEmpty(ref txtFactoryName, true, "Required") ||
        IsFieldEmpty(ref txtShortName, true, "Required") ||
        IsFieldEmpty(ref cboGodown, true, "Required"))
    { }

编辑

public bool IsFieldEmpty(ref TextBox txtControl, Boolean SetErrorProvider,string msgToShowOnError)
{
    ErrorProvider EP = new ErrorProvider();
    if (txtControl.Text == string.Empty)
    {
        EP.SetError(txtControl, msgToShowOnError);
        return true;
    }
    else
    {
        EP.Clear();
        return false;
    }
}

请评论,使用 ref 变量作为参数之一是否可以使用此方法。

我正在检查验证 onSubmit 事件winform

4

5 回答 5

10

您可以将单|用于 OR:

 if (IsFieldEmpty(ref txtFactoryName, true, "Required") |
    IsFieldEmpty(ref txtShortName, true, "Required") |
    IsFieldEmpty(ref cboGodown, true, "Required"))
{ }

双管||进行短路评估 |管进行全面评估。和
相同。&&&

请参阅MSDN 参考资料

对编辑的回应:

  1. txtControl 前面不需要'ref',删除它将大大有助于解决对您的方法的批评。IsFieldEmpty不对 txtControl 进行任何更改。您可以重命名为CheckFieldEmpty以进一步改进它。
  2. 奇怪的是,您在此方法中创建了一个 ErrorProvider 实例,这是否有效?表单上通常应该有一个(永久)实例。您可能希望此方法独立于 Form,因此只需添加一个 EP 作为参数。它可以代替 SetErrorProvider,可以检查 EP 参数是否为空。O,并替换EP.Clear();Ep.SetErrortxtControl, "");
于 2010-04-19T13:05:00.317 回答
10

明确说明你在做什么:

bool isFactoryNameEmpty = IsFieldEmpty(ref txtFactoryName, true, "Required");
bool isShortNameEmpty = IsFieldEmpty(ref txtShortName, true, "Required");
bool isGodownEmpty = IsFieldEmpty(ref cboGodown, true, "Required");
if (isFactoryNameEmpty || isShortNameEmpty || isGodownEmpty)
{
    // ...
}

(另外,我假设您需要调用所有三个函数,因为它们有副作用?在这种情况下,这IsFieldEmpty是一个非常糟糕的名字。)

于 2010-04-19T13:07:11.000 回答
6

你为什么需要它?我能想到的唯一原因是您的“IsFieldEmpty”函数也在对数据进行一些计算或更改,这让我很担心。一个名为“IsFieldEmpty”的函数真的不应该做任何其他事情。

在这种情况下,从可用性/可维护性的角度来看,您最好:

SomeFieldMaintenance(ref txtFactoryName, true, "Required")
SomeFieldMaintenance(ref txtShortName, true, "Required")
SomeFieldMaintenance(ref cboGodown, true, "Required")
if (IsFieldEmpty(txtFactoryname) ||
    IsFieldEmpty(txtShortName) ||
    IsFieldEmpty(cboGodown))
{ }

或者类似的东西。

于 2010-04-19T13:14:19.020 回答
0

到目前为止的答案都假设您想要验证所有字段,即使其中一个字段失败。这个假设在你原来的问题中并不明确。因此,如果您不介意在某个字段失败时停止验证,那么最简单的解决方案是使用 && 运算符而不是 ||。这将实现您的既定目标:“如果第一个函数返回 true,那么它还应该调用下一个函数,依此类推”。但是,如果第一个函数返回 false,则不会调用其他函数,这可能不是您想要的。

于 2010-04-19T16:12:27.410 回答
0

您所看到的在 C# 中称为短路。如果第一个表达式失败,那么它不会费心尝试下一个表达式,因为最终结果已经确定。

http://johnnycoder.com/blog/2006/08/02/short-circuit-operators-in-c/

你应该你| 而不是 || 得到你的结果。

 if (IsFieldEmpty(ref txtFactoryName, true, "Required") |
        IsFieldEmpty(ref txtShortName, true, "Required") |
        IsFieldEmpty(ref cboGodown, true, "Required"))

C# 运算符 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

|| 操作员。 http://msdn.microsoft.com/en-us/library/6373h346.aspx

| 操作员。 http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

于 2010-04-19T13:08:06.270 回答