繁体   English   中英

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

[英]How do I use foreach() on a control to manipulate another control?

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

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

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

  • 其他的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:

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

关于我想做的事情,我想问几个问题:

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

2.如果我只使用If-Else逐个检查它会更好(尽管我不想使用此方法,因为以后可能需要包括更多的复选框和滚动条,并且代码会变得可笑长非常快)。

3.是否还有其他更狡猾的方法(首选简洁和简短的方法)来完成你们可以建议的目标(如果有的话,您能提供一个例子)吗?

我想您正在采取正确的方法。 如果可能,请使用@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))

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

订阅每个复选框的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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM