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

你有OnSelectedIndexChangedcall inside OnSelectedIndexChanged,这是一个无穷无尽的递归调用。

于 2009-12-02T10:48:32.210 回答