在两个C#复选框之间切换

时间:2016-01-12 04:39:40

标签: c# checkbox toggle

使用C#,我试图在两个复选框之间创建一个关系: 1. chk_PeelTrace和2. chk_MoveTrace, 其中一次只能检查一个复选框,以便PeelTrace启动时为真,并且我检查MoveTrace,则应检查MoveTrace,而PeelTrace应取消选中。

然而,重要的是,两者都应该可以同时取消选中。我尝试了很多不同的东西;其中一些备选方案在下面的示例中进行了注释。

无论我尝试什么,我都无法正常工作。我一直在运行System.StackOverflowException,但不知道为什么。关于如何做到这一点的任何想法或建议?

    private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e)
    {
        ////if (tracePeel)
        //if (chk_PeelTrace.CheckState.Equals(CheckState.Checked))
        if (chk_PeelTrace.Checked)
        {
            ////tracePeel = false;
            //chk_PeelTrace.CheckState = CheckState.Unchecked;
            chk_PeelTrace.Checked = !chk_PeelTrace.Checked;
            ////traceMove = false;
            //chk_MoveTrace.CheckState = CheckState.Unchecked;
            chk_MoveTrace.Checked = false;
        }
        else
        {
            ////traceMove = false;
            //chk_MoveTrace.CheckState = CheckState.Unchecked;
            chk_MoveTrace.Checked = false;
            ////tracePeel = true;
            //chk_PeelTrace.CheckState = CheckState.Checked;
            chk_PeelTrace.Checked = true;       
        }
    }

    private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e)
    {
        //if (chk_MoveTrace.Checked == true)
        ////if (traceMove)
        //if (chk_MoveTrace.CheckState.Equals(CheckState.Checked))
        if (chk_MoveTrace.Checked)
        {
            ////traceMove = false;
            //chk_MoveTrace.CheckState = CheckState.Unchecked;
            chk_MoveTrace.Checked = !chk_MoveTrace.Checked;
            ////tracePeel = false;
            //chk_PeelTrace.CheckState = CheckState.Unchecked;
            chk_PeelTrace.Checked = false;
        }
        else
        {
            ////tracePeel = false;
            //chk_PeelTrace.CheckState = CheckState.Unchecked;
            chk_PeelTrace.Checked = false;
            ////traceMove = true;
            //chk_MoveTrace.CheckState = CheckState.Checked;
            chk_MoveTrace.Checked = true;
        }
    }

2 个答案:

答案 0 :(得分:1)

你几乎就在那里,只需添加一些标志(布尔字段)来禁止处理由另一个处理程序代码引起的事件。

private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e)
{
    if (handleChecked)
    {
        handleChecked=false;
        // your handler code
        handleChecked=true;
    }
}

private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e)
{
    if (handleChecked)
    {
        handleChecked=false;
        // your handler code
        handleChecked=true;
    }
}

答案 1 :(得分:0)

因为我已经理解了你想要两个都是假的问题,但两者都不应该同时存在,那么如何尝试下面这个简单的代码:

 private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e)
    {
        if (chk_PeelTrace.Checked) 
        {
            chk_MoveTrace.Checked = false;
        }
    }

    private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e)
    {
        if (chk_MoveTrace.Checked)
        {
            chk_PeelTrace.Checked = false;
        }
    }

这对我来说也很好