窗口内特定类型的每个对象的“foreach”循环

问题描述 投票:0回答:1

我在一个窗口中有 10 个 SpinEdit 对象,它们具有最小值和最大值。 在按钮的单击事件中,我需要检查这些对象之一是否超出范围。 目前我创建了以下函数,但我必须为每个对象单独调用它:

public bool SpinEditValueOK(decimal Value, decimal MinValue, decimal MaxValue)
{
    if (Value > MinValue && Value < MaxValue) { return true; }
    else { return false; }
}

是否可以执行“foreach”循环来参数化 SpinEdit 对象?

c#
1个回答
-1
投票

首先,您需要一种方法来迭代表单上的所有控件。这并不简单,因为控件可以嵌套,但 Form 的

Controls
集合仅包含顶级控件。

您可以使用这种递归扩展方法来迭代所有控件:

public static class WinFormsExtensions
{
    public static IEnumerable<Control> Descendants(this Control parent)
    {
        foreach (Control c in parent.Controls) {
            yield return c;
            foreach (Control child in c.Descendants()) {
                yield return child;
            }
        }
    }
}

然后你可以像这样检查

SpinEdit
控件:

public bool SpinEditValuesOK()
{
    return this.Descendants()
        .OfType<SpinEdit>()
        .All(c => c.Value >= c.MinValue && c.Value < c.MaxValue);
}

我假设此代码位于表单中,并且

this
代表表单。

© www.soinside.com 2019 - 2024. All rights reserved.