3

ユーザーが1つのフィールドを更新すると、他のフィールドが自動的にいくつかのデータで更新されるように.Netでコントロールを更新することについて質問があります。一部のデータを変換する 2 つの NumericUpDown コントロールを使用しています。

私が抱えている問題は、ValueChanged イベントを使用していることです。このため、これらのコントロールは、1 つのコントロールが別のコントロールを更新し、もう 1 つのコントロールが最初のコントロールを更新しようとするループに陥ることがあります。結果はややランダムです。

では、この状況に対処するための最良のアプローチは何でしょうか? 要するに、最初のコントロールがユーザー自身によって変更された場合にのみ、他のコントロールを更新したいのです。

どんな助けでも大歓迎です。

4

4 に答える 4

2

メソッドFooが一方のコントロールのイベントをBar処理し、メソッドが他方のイベントを処理する場合、のコントロールFooの値を変更する必要があり、Barその逆も同様です。ただし、どこかでコントロール変数を使用する必要があります (たとえば、イベントを発生させたコントロールへの参照は良い考えです)。そのため、次のようFooに呼び出されます。

  • FooBarのコントロールの値を更新します。
  • Barのコントロールがそのイベントを発生させ、Bar呼び出されます。
  • Bar最初にショットしたコントロールの参照をチェックし、それがそのコントロールではないことを確認し、何もしません。

にも同じロジックが適用されBarます。

そうすれば、無限ループに陥ることはありません。

コードでは、次のようになります。

nud1.ValueChanged += new Eventhandler(Foo);
nud2.ValueChanged += new Eventhandler(Bar);
NumericUpDown shooter = null;

private void Foo (object sender, EventArgs e)
{
    if (this.shooter == null)
    {
        this.shooter = nud1;
        nud2.Value = nud1.Value;
    }
    else this.shooter = null;
}

private void Bar (object sender, EventArgs e)
{
    if (this.shooter == null)
    {
        this.shooter = nud2;
        nud1.Value = nud2.Value;
    }
    else this.shooter = null;
}

もちろん、これは大まかな例です (たとえば、両方のコントロールの値が常に変化していると想定しています。状況に合わせて調整してください。

于 2013-05-29T18:36:24.880 に答える
2

クラスでブールガードを使用して、更新メソッド内にいるかどうかを確認してください。更新中は、NUD から発生する今後のすべてのイベントは無視されます。

private boolean updating = false; // Class level variable

void event_handler(...) // The function hooked up to the ValueChanged event
{
    if( !updating )
    {
        updating = true;
        // Do your calculations and update the NUDs
        updating = false;
    }        
}
于 2013-05-29T18:40:26.217 に答える