1

KryptonToolkit の ListBox コントロールを継承して、SelectedItemChanging イベントを取得しました。

public class CPListBox : KryptonListBox
{       
    public event CancelEventHandler SelectedIndexChanging;

    protected virtual void OnSelectedIndexChanging(CancelEventArgs e)
    {
        SelectedIndexChanging(this, e);
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {           
        CancelEventArgs cArgs = new CancelEventArgs();
        OnSelectedIndexChanged(cArgs);

        if(!cArgs.Cancel)
        {
            base.OnSelectedIndexChanged(e);
        }
    }
}

フォームでは、コードでイベントを処理します:

    void UsersListBoxSelectedIndexChanging(object sender, CancelEventArgs e)
    {
        if(_presenter.CurrentUser.IsModified)
        {
            MessageBox.Show("Nie zapisales zmian!");
            e.Cancel = true;
        }

    }

そして、stackOverflow ;)例外が発生しました。たぶん、誰かがこのコードで何が間違っているのでしょうか?

4

3 に答える 3

6

メソッド自体を永久に再帰的に呼び出しています。これらの再帰呼び出しには終了条件がありません。スタック オーバーフローが発生します。

protected override void OnSelectedIndexChanged(EventArgs e)
{                       
       CancelEventArgs cArgs = new CancelEventArgs();
       OnSelectedIndexChanged(cArgs); // Clearly calling yourself indefinitely.
       //...
}
于 2009-12-02T10:48:07.300 に答える
3
protected override void OnSelectedIndexChanged(EventArgs e)
        {                       
                CancelEventArgs cArgs = new CancelEventArgs();
                //Next line!!
                OnSelectedIndexChanged(cArgs);

                if(!cArgs.Cancel)
                {
                        base.OnSelectedIndexChanged(e);
                }
        }

あなたは自分自身を呼んでいます。したがって、StackOverflow 例外が発生します。

于 2009-12-02T10:49:28.250 に答える
2

OnSelectedIndexChanged内に呼び出しがあります。OnSelectedIndexChangedこれは無限の再帰呼び出しです。

于 2009-12-02T10:48:32.210 に答える