2014-06-10 91 views
0

我對Containers工具箱中的TabControl有問題。如何在TabControl的標籤頁上對RadioButtons進行分組

我可以將標籤設置爲頁面和佈局都很好,所有工作都很好,直到我在每個頁面上放置4個RadioButton。 如果我點擊一個RadioButton,它會被檢查,如果我點擊另一個被選中,第一個被清除,那麼這麼好。 當我切換到不同的標籤頁並單擊一個RadioButton時,問題就開始了,它會被檢查,但前一頁上的RadioButton也會被檢查。

是否有任何方法將所有頁面上的所有RadioButton分組在一起,以便在任何時候只檢查一個RadioButton?

+0

此答案:http://stackoverflow.com/a/16239389/491907顯示單選按鈕(實際複選框)的子類的實例,其中一個' GroupName'屬性(類似於WPF)被添加。我沒有嘗試過,但它可能是一個開始。 – pinkfloydx33

+2

與您之前的問題相同。您不能在多個容器中使用AutoCheck屬性。所以你必須將它設置爲False,並編寫代碼將Checked屬性顯式設置爲false。如果你感覺到你在與機器對抗,那麼你是對的,這不是一個好的用戶界面。 –

回答

0

感謝您的意見。我有7個選項卡控制頁面,代表每週7天。 每頁有4個DGV。從中央列表DB中選擇 項目,並將其放置到所需日期的DGV中。 要求的DGV可以通過選中radioButton或點擊選擇radioButton的DGV來選擇。項目放置的位置取決於只檢查一個radioButton。 由於只有28個radioButton,我會給每個checkChanged事件如下。

public int selectedDay{ get; set;} 

    public void clearOtherDays(int day) 
    { 
     if (day != 1) 
     { rbB1.Checked = false; rbL1.Checked = false; rbD1.Checked = false; rbS1.Checked = false;} 
     if (day != 2) 
     { rbB2.Checked = false; rbL2.Checked = false; rbD2.Checked = false; rbS2.Checked = false;} 
     if (day != 3) 
     { rbB3.Checked = false; rbL3.Checked = false; rbD3.Checked = false; rbS3.Checked = false;} 
     if (day != 4) 
     { rbB4.Checked = false; rbL4.Checked = false; rbD4.Checked = false; rbS4.Checked = false;} 
     if (day != 5) 
     { rbB5.Checked = false; rbL5.Checked = false; rbD5.Checked = false; rbS5.Checked = false;} 
     if (day != 6) 
     { rbB6.Checked = false; rbL6.Checked = false; rbD6.Checked = false; rbS6.Checked = false;} 
     if (day != 7) 
     { rbB7.Checked = false; rbL7.Checked = false; rbD7.Checked = false; rbS7.Checked = false;} 
    } 

    private void rbL1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (rbL1.Checked) {clearOtherDays(1); selectedDay = 1; } 
    } 

這似乎做的工作,但如果有一個更好的解決辦法我打開思路,學習好。

很多謝謝。

1

我和Hans Passant在一起。首先,這聽起來像是一個你應該重新考慮的設計,讓任何控件與隱藏的控件交互,而這些隱藏的控件不會與其他與之交互的控件顯示出來。我提醒你重新考慮你的設計。

帶着這個免責聲明,當人們不回答我的問題時,我仍然很生氣,他們所做的只是批評我的問題,真的問我'爲什麼要那樣做',或者你不應該這樣做。我的嘗試是給你積極的批評,重新考慮你的設計。 但是我仍然會給你我的問題的最佳答案...

所以我只是將它編碼到每個單選按鈕上的檢查事件。這有點古怪,但我認爲你的設計和你想要做的是(非常)奇怪。

所以每個選中的事件中,你需要首先:測試,目前的(新)檢查值是真實的,不是虛假的,因爲檢查事件觸發這兩個事情發生的時候:當無線電按鈕變爲檢查時它變得沒有檢查。這有點奇怪,如果你不尋找這個或知道尋找這個。

第二,如果它被選中,那麼我會調用一個單獨的'UncheckRadioButtons'方法,其中一個參數傳遞了剛剛檢查過的單選按鈕。在這個UncheckRadioButtons方法中,我會有一個數組或單選按鈕列表,它包含您只希望其中一個選中的所有單選按鈕,然後爲每個循環遍歷RadioButton中的每個項目列表或數組。在你的循環中,你可以簡單地測試這個單選按鈕是否與傳遞給你的UncheckRadioButtons方法的單選按鈕相同,如果它不是相同的單選按鈕並且它被選中,那麼取消選中該單選按鈕。因此您的UncheckRadioButtons方法將取消選中除傳遞給它的一個RadioButton作爲參數的所有RadioButton。

抱歉,我沒有時間爲您編寫這樣的方法,以便更好地爲您提高我的答案。但我想實際給你一個真實的答案,至少在你的路上幫助你。 :)

0

舊的線程,但我會把我的兩美分的解決方案在這裏。

派生您的解決方案我只是取消選中檢查時不在活動標籤頁上的選項卡控件的所有選項卡頁上的所有單選按鈕。

/// <summary> Unchecks all the radio buttons on each tab page except the active one </summary> 
/// <param name="activePage"> The active tab page when the radio button was clicked</param> 
private void UncheckLayouts(TabPage activePage) 
{ 
    foreach (TabPage tabPage in tabLayouts.TabPages) 
    { 
     if (tabPage == activePage) continue; 
     foreach (RadioButton rb in tabPage.Controls) 
     { 
      rb.Checked = false; 
     } 
    } 
} 

,然後將每個事件的CheckedChanged:

UncheckLayouts(tabControl.SelectedTab); 
相關問題