为什么这个简单的代码导致了错误的错误:
无法计算表达式,因为当前线程处于堆栈溢出状态。
private void barButtonPanelVisibleCheck_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
switch (barButtonPanelVisibleCheck.Checked)
{
case true:
this.navBarControl.Visible = false;
this.barButtonPanelVisibleCheck.Checked = false;
break;
case false:
this.navBarControl.Visible = true;
this.barButtonPanelVisibleCheck.Checked = true;
break;
}
//or
if (barButtonPanelVisibleCheck.Checked == true)
{
this.navBarControl.Visible = false;
this.barButtonPanelVisibleCheck.Checked = false;
}
else
{
this.navBarControl.Visible = true;
this.barButtonPanelVisibleCheck.Checked = true;
}
}
答案 0 :(得分:3)
您正在Checked处理程序中更改Checked:已设置Checked值,因此调用处理程序,设置Checked值等,并且您有一个无限循环。
答案 1 :(得分:2)
由于您在CheckedChanged
事件中尝试更改复选框的已检查状态,因此会引发另一个CheckedChanged事件,这将启动一个消耗堆栈内存的无限循环,直到达到StackOverflow异常
尝试使用
停止CheckedChanged事件的递归 private void barButtonPanelVisibleCheck_CheckedChanged(object sender,
DevExpress.XtraBars.ItemClickEventArgs e)
{
try
{
this.barButtonPanelVisibleCheck.CheckedChanged -=
barButtonPanelVisibleCheck_CheckedChanged;
... do your checked changed here
}
finally
{
this.barButtonPanelVisibleCheck.CheckedChanged +=
barButtonPanelVisibleCheck_CheckedChanged;
}
}
断开事件处理程序允许更改已检查状态而不重新输入事件处理程序,之后重新连接事件。可能对于这种情况,不需要使用try / finally,但使用finally
将确保事件始终重新连接,以防您的代码因异常而失败。
答案 2 :(得分:0)
当检查控件的状态改变时,调用方法barButtonPanelVisibleCheck_CheckedChanged
。在该方法中,您更改该控件的Checked
属性,这会导致调用方法barButtonPanelVisibleCheck_CheckedChanged。在该方法中,您可以更改该控件的Checked属性。