防止每个控件重复C#代码?

时间:2014-02-11 22:28:18

标签: c# loops self-reference

我目前的代码应用程序最终应该是针对ProEvolutionSoccer统计转换器的足球经理,但是,现在,问题是我在C#中是一个安静的新人,并且我有超过60个numericUpDowns。

每个上升流都应该在某些污道处改变颜色,例如,在值13时,后颜色需要变为绿色,在15变为黄色,等等。

以下是我在valueChange事件中所做的一个例子:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    decimal corners = numericUpDown1.Value;

    if (corners < 13)
    {
        numericUpDown1.BackColor = Color.White;
    }
    else if(corners >= 13 && corners < 15)
    {
        numericUpDown1.BackColor = Color.LightGreen;
    }
    else if (corners >= 15 && corners < 17)
    {
        numericUpDown1.BackColor = Color.Yellow;
    }
    else if (corners >= 17 && corners < 19)
    {
        numericUpDown1.BackColor = Color.Orange;
    }
    else
    {
        numericUpDown1.BackColor = Color.Red;
    }
}

问题不仅仅是显而易见的,因为我真的不想写这个块超过60次并只更改更新的索引或订单号。

是否存在任何类型的自我引用,例如在php中使用self关键字,或者这个或父级, CLASS 等等......

或者某种循环会是更好的选择吗?

3 个答案:

答案 0 :(得分:3)

您可以为每个控件使用相同的事件处理程序。只需使用sender参数代替numericUpDown1

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    var numericUpDown = (NumericUpDown)sender;
    decimal corners = numericUpDown.Value;

    if (corners < 13)
    {
        numericUpDown.BackColor = Color.White;
    }
...

然后,在订阅控件时,您可以使用相同的处理程序。

例如,对于Asp.Net:

<asp:NumericUpDown id="numericUpDown1" OnValueChanged="numericUpDown_ValueChanged" />
<asp:NumericUpDown id="numericUpDown2" OnValueChanged="numericUpDown_ValueChanged" />
<asp:NumericUpDown id="numericUpDown3" OnValueChanged="numericUpDown_ValueChanged" />

例如,对于Winforms:

numericUpDown1.ValueChanged += numericUpDown_ValueChanged;
numericUpDown2.ValueChanged += numericUpDown_ValueChanged;
numericUpDown3.ValueChanged += numericUpDown_ValueChanged;

答案 1 :(得分:2)

您可以让每个控件引用相同的ValueChanged方法,然后sender将是NumericUpDown触发事件的位置。

答案 2 :(得分:0)

为什么不在像这样的类中创建静态函数/方法?

Public class Tools {
    public static Color getColorFromDecimal(decimal corners){
if (corners < 13)
{
    return Color.White;
}
else if(corners >= 13 && corners < 15)
{
    return Color.LightGreen;
}
else if (corners >= 15 && corners < 17)
{
    return Color.Yellow;
}
else if (corners >= 17 && corners < 19)
{
    return Color.Orange;
}
else
{
    return Color.Red;
}
}
}

然后就这样称呼它

decimal corners = numericUpDown1.Value;
numericUpDown.BackColor = getColorFromDecimal(corners);