我正在使用winform创建UI,我正在使用VS2015来创建winform。 UI通过选项卡控件细分为多个页面。在其中一个标签页和其他内容(图片框,文本框,按钮等)中,我有8个名为cb1~cb8的复选框,以及8个名为scrjoint1~scrjoint8的水平滚动条。
滚动条用于为图片框中绘制的对象设置RotateTransform()中的角度值。我想做的是:
1.如果检查cb1,则scrjoint1为0.
2.如果检查cb2,则scrljoint2为0.
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被检查),我该如何设置相应的水平滚动条(scrJoint1
和scrJoint2
)到0 in:
if (((CheckBox)cbControl).Checked)
{
//set scrolJoint1~8 = 0 according to checkbox that
}
else
{
//Do nothing
}
关于我正在尝试做的事情,我想提出更多问题:
1.在我想要实现的目标中使用foreach()
一个好主意吗?
2.如果我只是使用If-Else逐个检查它会更好(虽然我不想使用这种方法,因为我可能需要在以后包含更多复选框和滚动条,以及代码会非常快地变得荒谬可笑。)
3.还有另外一种更狡猾的方法(干净和简短的方法是首选)做我想要实现的,你们可以建议(如果有的话,你能提供一个例子)。
答案 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
属性中(Checkbox
和ScrollBar
),然后使用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);
}