2012-01-10 114 views
1

我有一個有一些單選按鈕的組框。我正在嘗試使用Code Project的教程來實現序列化。該教程支持複選框的序列化,而不是單選按鈕。所以我需要將我應用程序中的單選按鈕設置爲複選框(即它們應該是複選框,但像單選按鈕一樣工作)。C#.net使複選框表現爲一個單選按鈕

我試過編寫代碼,但是當我發現某個複選框被選中並且我去取消選中或反之亦然時,它會觸發checked_changed事件處理程序,並進入無限循環。

有人可以幫我解決這個問題嗎?

感謝

UPDATE:

看到您的答覆後,我想說非常感謝。是的,你說的沒錯,我們不應該搞亂基本屬性。我將改變序列化方法。

P.S的鏈接,該教程是http://www.codeproject.com/KB/dialog/SavingTheStateOfAForm.aspx

最後更新:

下貼在這裏的答覆,我決定不更改默認屬性,但改變串行代碼之後。我做到了,現在它完美地工作。非常感謝,每個人。

+9

確認...不要這樣做。控制是標準化的一個原因 - 如果用戶看到radiobutons他們期望只有1可以選擇。如果他們看到複選框,他們希望能夠多選。 – Jamiec 2012-01-10 14:56:31

+2

1)發佈一些代碼。 2)如何鏈接到教程。 3)使複選框執行像RadioButtons聽起來像一個壞主意。我認爲一個更好的主意是改變序列化來支持RadioButton。 – cadrell0 2012-01-10 14:56:52

+2

爲什麼不簡單地使用與複選框序列化相同的方式來實現單選按鈕的序列化?不應該有很大的區別。 – Vlad 2012-01-10 14:57:14

回答

5

我同意所有的評論者:不會使複選框的行爲像單選按鈕,它飛行在UI約定和麪對用戶混淆。

這樣做的正確方法是修復代碼以序列化單選按鈕,但沒有看到代碼就很難知道如何爲您提供幫助。首先,您可以通過在做任何事之前臨時刪除事件處理程序來修復循環操作CheckedChanged。例如:

myCheckBox.CheckedChanged -= MyCheckedChangedEventHandler; 
myCheckBox.Checked = true; 
myCheckBox.CheckedChanged += MyCheckedChangedEventHandler; 

如果這本身並不能解決您的問題,請告訴我們你的代碼,我們將盡力幫助更多。

編輯:基於你的更新中列出的教程,我猜你會打電話FormSerialisor.Deserialise(),觸發你的控件的事件處理程序觸發問題?如果是這種情況,快速解決方法是做我剛剛提到的:在調用FormSerialisor.Deserialise()之前刪除單選按鈕事件處理程序,然後重新添加它們。例如:

myRadioButton.CheckedChanged -= MyCheckedChangedEventHandler; 
FormSerialisor.Deserialise(this, mySerialisepath); 
myRadioButton.CheckedChanged += MyCheckedChangedEventHandler; 

您可能還需要編輯FormSerialisor類來處理RadioButtons;只需複製處理複選框的代碼,但將所有引用更改爲RadioButton。從你的問題來看,這個步驟是否有必要是不明確的。

+0

我明白你想告訴你什麼。本教程不處理單選按鈕。我會改變它來處理它們。非常感謝你的幫助。 – Bharath 2012-01-10 15:40:18

+0

非常感謝您的信息。我沒有使用register/unregister checked event。我所做的只是編輯串行器類來處理單選按鈕。再次感謝。 – Bharath 2012-01-10 15:47:34

0

就像評論說的那樣,你最好使用單選按鈕來處理序列化,而不是用複選框搞亂。話雖如此,爲了得到您需要的效果,只需設置一個變量,指出您已經處理了一個變更事件並對其進行測試。在這之前

private bool autoChange = false; 
    private void ChangeHandler() { 
     if (!autoChange) { 
      autoChange = true; 
      /* Do stuff */ 
      autoChange = false; 
     } 
    } 
0

註銷從Checked事件(通過使用-=):像這樣的東西(這是可怕的代碼,但是它展示了這個想法)。完成後重新註冊。

(我不評論爭論只是回答問題。)

1

你好,這裏簡單ansewer的複選框轉變爲一個單選按鈕:

object clickBox = null; 

private void checkBox_Click(object sender, EventArgs e) 
    { 
     clickBox = sender; 

     foreach (Control c in this.Controls) 
     { 
      if (c is CheckBox) 
      { 
       if (c != clickBox) 
       { 
        ((CheckBox)c).Checked = false; 
       } 
      } 
     } 

並添加這個點擊事件每個複選框 完成