2017-05-11 19 views
0

我在winform中製作一個UI,我使用VS2015來創建winform。用戶界面通過選項卡控件細分爲多個頁面。在其中一個標籤頁以及其他東西(圖片框,文本框,按鈕等)中,我有8個名爲cb1〜cb8的複選框和8個名爲scrjoint1〜scrjoint8的水平滾動條。如何在控件上使用foreach()來操縱另一個控件?

滾動條用於在圖片框中繪製的對象的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.是否有另一種更狡猾的做法(乾淨和短的方法是首選)做我想達到的,你們可以建議(如果有的話,你可以提供一個例子)。

+1

在每個複選框的檢查事件上設置邏輯並且設置相關的滾動條位置並禁用它會不會更容易? –

+0

一個想法是組合/放置chkBox和滾動到/到單個控件(即一個組),並有8個,這些控件封裝了checkBox和scroll之間的關係。另一種選擇是將chkBox的Tag屬性設置爲指向其相關滾動並使用它。 – tolanj

+0

代碼沒有贏得任何獎品,但它沒有錯。有太多的方法可以做到這一點,乾淨的方式不是簡短的方式。在構造函數中創建數組時它很乾淨。當您通過解析Name屬性來使用字符串輸入時,它很短。 –

回答

0

我想你是在做正確的做法。如果可能,請使用@Ofir Winegarten建議。否則明智的是你可以稍微修改你的method.and請放置適當的異常處理。

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)) 
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存儲在每個控制(CheckboxScrollBar)的Tag屬性,然後使用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); 
} 
+1

啊,我明白你的意思了。我會試試這個。謝謝 –

相關問題