代码之家  ›  专栏  ›  技术社区  ›  Adrian Serafin

c#,列表框,堆栈溢出异常

  •  1
  • Adrian Serafin  · 技术社区  · 16 年前

    我继承了KryptonToolkit列表框控件以获取SelectedItemChanged事件。

    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 回复  |  直到 16 年前
        1
  •  6
  •   Mehrdad Afshari    16 年前

    你一直在递归地调用方法本身。这些递归调用没有终止条件。这将导致堆栈溢出。

    protected override void OnSelectedIndexChanged(EventArgs e)
    {                       
           CancelEventArgs cArgs = new CancelEventArgs();
           OnSelectedIndexChanged(cArgs); // Clearly calling yourself indefinitely.
           //...
    }
    
        2
  •  3
  •   Yann Schwartz    16 年前
    protected override void OnSelectedIndexChanged(EventArgs e)
            {                       
                    CancelEventArgs cArgs = new CancelEventArgs();
                    //Next line!!
                    OnSelectedIndexChanged(cArgs);
    
                    if(!cArgs.Cancel)
                    {
                            base.OnSelectedIndexChanged(e);
                    }
            }
    

    你在叫你自己。因此出现了StackOVerflow异常。

        3
  •  2
  •   o.k.w    16 年前

    你有 OnSelectedIndexChanged 打电话进来 ,这是一个无休止的递归调用。

    推荐文章