如何使用一种方法禁用多个NumericUpDown控件

本文关键字:控件 NumericUpDown 方法 一种 何使用 | 更新日期: 2023-09-27 18:21:57

我有一个表单,其中有多个NumericUpDown作为输入答案的控件。我希望一个运算(乘法、求和等)的每个输入都为true,该运算的NumericUpDown将被禁用。我使用了下面的代码(仅用于求和运算),但我认为它效率不高,因为我必须制定一个方法来检查每个运算。

 private void IsSumTrue() {
        if (add1 + add2 == sum.Value)
        {
            sum.Enabled = false;
        }
    }
    private void IsDifferenceTrue()
    {
        if (add1 - add2 == difference.Value)
        {
            difference.Enabled = false;
        }
    }
    private void IsProductTrue()
    {
        if (add1 * add2 == product.Value)
        {
            product.Enabled = false;
        }
    }
    private void IsQuotientTrue()
    {
        if (add1 / add2 == quotient.Value)
        {
            quotient.Enabled = false;
        }
    }

有人知道如何通过一种针对所有操作的方法来提高效率吗?

下面是我的想法,但我不知道如何检查每个NumericUpDown的值是否为真。

private void DisableIfValueIsTrue()
    {
        foreach(Control control in this.Controls)
        {
            NumericUpDown value = control as NumericUpDown;
            // if(value [NEED HELP]
        }
    }

如何使用一种方法禁用多个NumericUpDown控件

考虑到您的情况,您可以在设计模式中为每个NumericUpDown设置一个标签,如下所示:

sum.Tag=1;
square.Tag=2;
etc

然后定义一些int变量:

int iSum=add1+add2;
int iSquare= //Whatever you want
etc

最后通过这种方式循环控制:

foreach (NumericUpDown control in this.Controls.OfType<NumericUpDown>())
{
  int intCondition = Convert.ToInt32(control.Tag) == 1
                      ? iSum
                      : Convert.ToInt32(control.Tag) == 2
                        ? iSquare
                        : Convert.ToInt32(control.Tag) == 3
                           ? i3
                           : i4; //You should extend this for your 8 controls
control.Enabled = intCondition == control.Value;
}

好!我提供的第二种方式

由于你必须始终检查8个不同的条件,你可以简单地忘记循环通过控件,只需像这样更改你的方法:

private void DisableIfValueIsTrue() 
{
  sum.Enabled = add1 + add2 != sum.Value;
  difference.Enabled= add1 - add2 != difference.Value;
  product.Enabled= add1 * add2 != product.Value;
  quotient.Enabled= (add2 !=0) && (add1 / add2 != quotient.Value);
  //etc
}

我在做一些研究时遇到了这个问题,我想给出我在这种情况下使用的解决方案,并希望它能帮助人们。我需要最小和最大的数字来进行计算,所以我的名字很合适,我把它们和一些复选框关联起来。我在最小值的开头和最大值的结尾使用了null来解释空。我还必须创建一个事件处理程序SubscribeToEvents(),如下所示。

在我的表单加载事件中:

SubscribeToEvents();
_checkBoxs = new[] { cbXLight, cbLight, cbMedium, cbHeavy, cbXHeavy,     cbXXHeavy, cbXXXHeavy };
_minimumsNumericUpDowns = new[] { null, nLightMin, nMediumMin, nHeavyMin, nXHeavyMin, nXXHeavyMin, nXXXHeavyMin };
_maximumsNumericUpDowns = new[] { nXLightMax, nLightMax, nMediumMax, nHeavyMax, nXHeavyMax, nXXHeavyMax, null };

然后我创建了一个方法:

private void DisableNumericUpDowns()
{
    // disable everything:
    foreach (var n in _minimumsNumericUpDowns)
    {
        if (n != null)
            n.Enabled = false;
    }
    foreach (var n in _maximumsNumericUpDowns)
    {
        if (n != null)
            n.Enabled = false;
    }
}

事件处理程序:

    private bool _eventsSubscribed;
    private void SubscribeToEvents()
    {
        if (_eventsSubscribed)
            return;
        _eventsSubscribed = true;
        cbXXHeavy.CheckedChanged += CheckBox_NumericState;
        cbXHeavy.CheckedChanged += CheckBox_NumericState;
        cbXLight.CheckedChanged += CheckBox_NumericState;
        cbHeavy.CheckedChanged += CheckBox_NumericState;
        cbLight.CheckedChanged += CheckBox_NumericState;
        cbMedium.CheckedChanged += CheckBox_NumericState;
        cbXXXHeavy.CheckedChanged += CheckBox_NumericState;
    }

现在我可以用它来检查它们何时被启用,如果需要的话,它们是否大于或小于0

    private void CheckBox_NumericState(object sender, EventArgs e)
    {
    // disable everything
    DisableNumericUpDowns();
    // see if more than one checkbox is checked:
    var numChecked = _checkBoxs.Count((cb) => cb.Checked);
    // enable things if more than one item is checked:
    if (numChecked <= 1) return;
    // find the smallest and enable its max:
    var smallest = -1;
    for (var i = 0; i < _checkBoxs.Length; i++)
    {
        if (!_checkBoxs[i].Checked) continue;
        if (_maximumsNumericUpDowns[i] != null)
        {
            _maximumsNumericUpDowns[i].Enabled = true;
        }
        smallest = i;
        break;
    }
    // find the largest and enable its min:
    var largest = -1;
    for (var i = _checkBoxs.Length - 1; i >= 0; i--)
    {
        if (!_checkBoxs[i].Checked) continue;
        if (_minimumsNumericUpDowns[i] != null)
        {
            _minimumsNumericUpDowns[i].Enabled = true;
        }
        largest = i;
        break;
    }
    // enable both for everything between smallest and largest:
    var tempVar = largest - 1;
    for (var i = (smallest + 1); i <= tempVar; i++)
    {
        if (!_checkBoxs[i].Checked) continue;
        if (_minimumsNumericUpDowns[i] != null)
        {
            _minimumsNumericUpDowns[i].Enabled = true;
        }
        if (_maximumsNumericUpDowns[i] != null)
        {
            _maximumsNumericUpDowns[i].Enabled = true;
        }
    }
    }

因此,我可以根据需要检查每个状态:

我想检查Extra Light是否已检查:

// Extra Light
if (!cbXLight.Checked) return;
if (nXLightMax.Enabled == false)
{
    _structCategoryType = XLight;
    CheckStructureSheets();
}
else
{
    if (nXLightMax.Value > 0)
    {
        _dMax = nXLightMax.Value;
        _structCategoryType = XLight;
        CheckStructureSheets();
    }
    else
    {
        MessageBox.Show(@"Extra Light Max cannot be zero (0)");
    }
}

和下一个光检查两者:

    // Light
    if (cbLight.Checked)
    {
        if (nLightMin.Enabled == false && nLightMax.Enabled == false)
        {
            _structCategoryType = Light;
            CheckStructureSheets();
        }
        else
        {
            if (nLightMin.Enabled && nLightMin.Value > 0)
            {
    if (nXLightMax.Enabled && nLightMin.Enabled && nLightMax.Enabled == false)
    {
        _dMin = nLightMin.Value;
        _structCategoryType = Light;
       CheckStructureSheets();
    }
    else
    {
        if (nLightMax.Value > 0)
       {
            _dMin = nLightMin.Value;
            _dMax = nLightMax.Value;
            _structCategoryType = Light;
            CheckStructureSheets();
        }
        else
        {
            MessageBox.Show(@"Light Max cannot be zero (0)");
            return;
        }
}
        }
        else if (nLightMin.Enabled == false && nLightMax.Enabled)
        {
    if (nLightMax.Value > 0)
    {
    _dMax = nLightMax.Value;
    _structCategoryType = Light;
    CheckStructureSheets();
    }
    else
   {
    MessageBox.Show(@"Light Max cannot be zero (0)");
    }
            }
            else
            {
    MessageBox.Show(@"Light Min cannot be zero (0)");
    return;
            }
        }
    }

希望这能帮助到别人。Tim

感谢@AlexJoliq和@BrettCaswell。我只想告诉大家,在亚历克斯将他的答案从"=="编辑为"!="之前,我(认为)已经解决了这个问题。但是我不知道哪里有更有效的方法,亚历克斯的还是我的。

以下是我的DisableIfValueIsTrue():代码

if (add1 + add2 == sum.Value) sum.Enabled = false;
if (add1 - add2 == difference.Value)  difference.Enabled = false;
if (add1 * add2 == product.Value) product.Enabled = false;
if (add1 / add2 == quotient.Value) quotient.Enabled = false;