如何在控件上使用foreach()来操作另一个控件?

时间:2017-05-11 09:00:40

标签: c#

我正在使用winform创建UI,我正在使用VS2015来创建winform。 UI通过选项卡控件细分为多个页面。在其中一个标签页和其他内容(图片框,文本框,按钮等)中,我有8个名为cb1~cb8的复选框,以及8个名为scrjoint1~scrjoint8的水平滚动条。

滚动条用于为图片框中绘制的对象设置RotateTransform()中的角度值。我想做的是:

1.如果检查cb1,则scrjoint1为0.

  • Else scrl1是用户设置的任何内容。

2.如果检查cb2,则scrljoint2为0.

  • 另外scrljoint2是用户设置的。

3.依此类推另一个复选框和水平滚动。

不是分别检查每个复选框,而是分别分配scrljint的值,我想到的是使用foreach()函数实现,如下所示:

private void scrJoint_Scroll(object sender, ScrollEventArgs e)
{
    foreach (var cbControl in this.Controls)
    {
        if (cbControl is CheckBox)
        {
            if (((CheckBox)cbControl).Checked)
            {
                //set scrolJoint1~8 = 0 according to checkbox that is checked
            }
            else
            {
                //Do nothing
            }
        }
    }
}

但是我现在遇到的当前问题是,当检查了一个或多个复选框时(假设cb1和cb2被检查),我该如何设置相应的水平滚动条(scrJoint1scrJoint2)到0 in:

if (((CheckBox)cbControl).Checked)
{
    //set scrolJoint1~8 = 0 according to checkbox that 
}
else
{
    //Do nothing
}

关于我正在尝试做的事情,我想提出更多问题:

1.在我想要实现的目标中使用foreach()一个好主意吗?

2.如果我只是使用If-Else逐个检查它会更好(虽然我不想使用这种方法,因为我可能需要在以后包含更多复选框和滚动条,以及代码会非常快地变得荒谬可笑。)

3.还有另外一种更狡猾的方法(干净和简短的方法是首选)做我想要实现的,你们可以建议(如果有的话,你能提供一个例子)。

2 个答案:

答案 0 :(得分:0)

我想你正在做正确的方法。如果可能,请使用@Ofir Winegarten建议。否则你可以稍微修改一下你的方法。并且也请进行适当的异常处理。

this.Controls.Cast<Control>().Where(row => row.GetType().IsAssignableFrom(typeof(CheckBox)) && ((CheckBox)row).Checked).All(row => SetScroll(((CheckBox)row)));

其中setScroll是一种方法 或

foreach (var cbControl in this.Controls.Cast<Control>().Where(row => row.GetType().IsAssignableFrom(typeof(CheckBox)) && ((CheckBox)row).Checked))

答案 1 :(得分:0)

一个简单的解决方案可能是:

订阅每个复选框的CheckedChanged事件 在这些方法中,将相关的scrollbar.Value设置为0并禁用它(scrollBar.Enabled = false)。

private void CbOnCheckedChanged_1(object sender, EventArgs eventArgs)
{
    SetScrollBarValue(this.cb1, this.scrjoint1)
}

private void CbOnCheckedChanged_2(object sender, EventArgs eventArgs)
{
    SetScrollBarValue(this.cb2, this.scrjoint2)
}

....

private static void SetScrollBarValue(CheckBox cb, ScrollBar sb)
{
    if (cb.Checked)
    {
        sb.Value = 0;
        sb.Enabled = false;
    }
    else sb.Enabled = true;
}

每个复选框都有相同的方法。

更通用的方法是使用相同的方法订阅不同的复选框事件,并使用上面提到的技术之一获取相关的滚动条。在下面的例子中,我选择了最短的一个 - 按名称搜索:

private void CbOnCheckedChanged(object sender, EventArgs eventArgs)
{
    CheckBox cb = (CheckBox) sender;
    ScrollBar sb = (ScrollBar) this.Controls.Find("scrJoint" + cb.Name.Last());
    SetScrollBarValue(cb, sb);
}

另一个非常简短的方法是将id存储在每个控件的Tag属性中(CheckboxScrollBar),然后使用linq获取滚动条:

private void CbOnCheckedChanged(object sender, EventArgs eventArgs)
{
    CheckBox cb = (CheckBox) sender;
    ScrollBar sb = 
        this.Controls.OfType<ScrollBar>().Single(bar => (int)bar.Tag ==(int)cb.Tag);    
    SetScrollBarValue(cb, sb);
}