C#, список, исключение stackOverflow
Я унаследовал элемент управления 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;) Исключение. Может быть, кто-то сейчас что-то не так с этим кодом?
3 ответа
Решение
Вы рекурсивно вызываете метод сам по себе навсегда. Для этих рекурсивных вызовов нет завершающего условия. Это приведет к переполнению стека.
protected override void OnSelectedIndexChanged(EventArgs e)
{
CancelEventArgs cArgs = new CancelEventArgs();
OnSelectedIndexChanged(cArgs); // Clearly calling yourself indefinitely.
//...
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
CancelEventArgs cArgs = new CancelEventArgs();
//Next line!!
OnSelectedIndexChanged(cArgs);
if(!cArgs.Cancel)
{
base.OnSelectedIndexChanged(e);
}
}
Ты звонишь сам. Отсюда исключение StackOVerflow.
У тебя есть OnSelectedIndexChanged
позвонить в OnSelectedIndexChanged
Бесконечный рекурсивный вызов.