簡體   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