c #, список, исключение stackOverflow - PullRequest
1 голос
/ 02 декабря 2009

Я унаследовал элемент управления ListBox KryptonToolkit, чтобы получить событие 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;) Исключение. Может быть, кто-то сейчас, что с этим кодом wron?

Ответы [ 3 ]

6 голосов
/ 02 декабря 2009

Вы рекурсивно вызываете метод сам по себе навсегда. Для этих рекурсивных вызовов нет завершающего условия. Это приведет к переполнению стека.

protected override void OnSelectedIndexChanged(EventArgs e)
{                       
       CancelEventArgs cArgs = new CancelEventArgs();
       OnSelectedIndexChanged(cArgs); // Clearly calling yourself indefinitely.
       //...
}
3 голосов
/ 02 декабря 2009
protected override void OnSelectedIndexChanged(EventArgs e)
        {                       
                CancelEventArgs cArgs = new CancelEventArgs();
                //Next line!!
                OnSelectedIndexChanged(cArgs);

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

Ты звонишь сам. Следовательно, исключение StackOVerflow.

2 голосов
/ 02 декабря 2009

У вас OnSelectedIndexChanged вызов в OnSelectedIndexChanged, это бесконечный рекурсивный вызов.

...