3

いくつかのフィールドを検証したいコードで3つの関数を呼び出しています。以下のコードで作業しようとすると。誤った結果が得られるまで、最初の値のみをチェックします。

fisrt関数がtrueを返す場合は、next関数も呼び出す必要があります。これを行うためにOrOperatorの代わりに使用できるもの。

    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;
    }
}

コメントしてください、このメソッドは、パラメーターの1つとしてref変数を使用して問題ありませんか。

のSubmitイベントの検証をチェックしてい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」を付ける必要はありません。これを削除すると、ここでのアプローチに対する批判に対処するのに大いに役立ちます。IsFieldEmptytxtControlは変更されません。CheckFieldEmpty名前をに変更して、もう少し改善することができます。
  2. このメソッド内にErrorProviderインスタンスを作成するのは奇妙ですが、それはまったく機能しますか?通常、フォームには1つの(永続的な)インスタンスがあります。このメソッドをフォームから独立させたい場合は、EPをパラメーターとして追加するだけです。SetErrorProviderを置き換えることができ、EPパラメータのnullを確認できます。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)
{
    // ...
}

(また、副作用があるため、3つの関数すべてを呼び出す必要があると思いますか?この場合、これ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

あなたが見ているのは、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 に答える
0

これまでの回答では、フィールドの1つが失敗した後でも、すべてのフィールドを検証することを前提としています。この仮定は、元の質問では明確ではありません。したがって、1つのフィールドが失敗したときに検証を停止してもかまわない場合、最も簡単な解決策は、||の代わりに&&演算子を使用することです。これにより、「最初の関数がtrueを返す場合は、次の関数も呼び出す必要があります」という目標を達成できます。ただし、最初の関数がfalseを返す場合、他の関数は呼び出されないため、目的の関数ではない可能性があります。

于 2010-04-19T16:12:27.410 に答える