区分在WinForm C#中选择了哪些单选按钮

Distinguish which radio buttons are selected in WinForm C#

我已经研究了一段时间,但不太明白。基本上它是一个带有多个单选按钮的混色程序,问题是当 blue1 和 blue 2 都被选中时,formbackground 应该变为蓝色。由于下面的代码,它变为紫色。无论如何,是否可以通过此处的 try/finally、OrElse 语句来确定代码的优先级?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void mixrButton_Click(object sender, EventArgs e)
    {
        if (red1.Checked && red2.Checked)
        {
            this.BackColor = Color.Red;
        }
        if (blue1.Checked && blue2.Checked)
        {
            this.BackColor = Color.Blue;
        }
        if (yellow1.Checked && yellow2.Checked)
        {
            this.BackColor = Color.Yellow;
        }

        if ((red1.Checked || blue1.Checked) && (red2.Checked || blue2.Checked))
        {
            this.BackColor = Color.Purple;
        } 

        if ((red1.Checked || yellow1.Checked) && (red2.Checked || yellow2.Checked))
        {
            this.BackColor = Color.Orange;
        }

        if ((blue1.Checked || blue2.Checked) && (yellow1.Checked || yellow2.Checked))
        {
            this.BackColor = Color.Green;
        }            
    }

    private void clear_Click(object sender, EventArgs e)
    {
        this.BackColor = SystemColors.Control;
    }
}

您的主要问题是:

  • 你没有使用的事实 if/else
  • 事实上你的Purple逻辑是错误的

在这里,即使你没有使用else声明,你应该有蓝色,但你说它会是紫色if ((red1.Checked || blue1.Checked) && (red2.Checked || blue2.Checked))也就是说如果

  • red1 & red2(应该是红色...)
  • red1 & blue2(这里紫色可以...)
  • blue1 & red2(这里紫色没问题...)
  • blue1 & blue2(应该是蓝色的……)

这是您想要的颜色的可能实现方式:

private void mixrButton_Click(object sender, EventArgs e)
{
    if (red1.Checked && red2.Checked)
    {
        this.BackColor = Color.Red;
    }
    else if (blue1.Checked && blue2.Checked)
    {
        this.BackColor = Color.Blue;
    }
    else if (yellow1.Checked && yellow2.Checked)
    {
        this.BackColor = Color.Yellow;
    }
    else if ((red1.Checked && blue2.Checked) || (blue1.Checked && red2.Checked))
    {
        this.BackColor = Color.Purple;
    } 
    else if ((red1.Checked && yellow2.Checked) || (yellow1.Checked && red2.Checked))
    {
        this.BackColor = Color.Orange;
    }
    else if ((blue1.Checked && yellow2.Checked) || (yellow1.Checked && blue2.Checked))
    {
        this.BackColor = Color.Green;
    }
}

您还可以创建一个返回背景颜色的函数并使用 ifreturn,或者使用第一种颜色然后第二种颜色的方法

它不是很漂亮,但您也可以交换语句的顺序,将前三个(更严格)放在后三个(更不严格)之下。这样,较严格的将覆盖较不严格的,您应该会得到预期的结果。

由于 运行 不必要的代码,我仍然不喜欢它,但它是一个选项。 编辑:恕我直言,建议的 "else if" 解决方案更好。

正如其他人评论的那样,您的条件不明确,可以通过在 if 块中应用更多逻辑来解决。

BUT - 每当我看到一堆 if/then 这样的陈述时,我都会退后一步,问我是否应该以不同的方式解决问题, 因为深入了解该逻辑很快就会变得不可读且无法维护。

对于不同的实现(只有您拥有的 3 种颜色),我会立即做这样的事情,这减少了要经过的逻辑量并将颜色更改代码放在一个地方而不是通过代码分散它:

// declaration
[Flags] 
enum ScreenColors 
{
    None = 0,
    Red = 1,
    Yellow = 2,
    Blue = 4 
}

private void button1_Click(object sender, EventArgs e)
{
    ScreenColors selectedColors = ScreenColors.None;

    if (red1.Checked || red2.Checked)
    {
        selectedColors |= ScreenColors.Red;
    }       
    // etc for yellow, blue

    // now I have a flags enum with only the 2 colours I care about

    // so I can build a lookup table that says what combinations of source colors maps to what destination

    Dictionary<ScreenColors, Color> lookups = new Dictionary<ScreenColors, Color>()
    {
        {ScreenColors.Red, Color.Red},
        {ScreenColors.Yellow, Color.Yellow},
        {ScreenColors.Blue, Color.Blue},
        {ScreenColors.Red | ScreenColors.Blue, Color.Purple},
        {ScreenColors.Red | ScreenColors.Yellow, Color.Orange},
        {ScreenColors.Blue | ScreenColors.Yellow, Color.Green},
    };

    //... and now all I have to do is look up the flags in the dictionary to get the correct background
    this.BackColor = lookups[selectedColors];
}