2009-06-01 69 views
5

我有一個包含3個單選按鈕的WinForms對話框。我正在使用ApplicationSettings來綁定這些RadioButton控件中的每一個的Checked屬性,但它不會執行我期望它執行的操作。現在我必須點擊每個單選按鈕兩次才能檢查並且選定的單選按鈕不會被保留。使用ApplicationSettings來存儲WinForms RadioButtons的Checked屬性

當窗體關閉時需要執行一行代碼以保存用戶設置?

如何消除單擊按鈕時需要兩次?

有沒有更好的方法來堅持這種類型的用戶設置?我在對話框類上有一個公共屬性,它根據哪個單選按鈕被選中來獲取/設置枚舉值,但我沒有看到將該屬性綁定到用戶設置的簡單方法。

編輯:應該指定我正在使用vb.net。我認爲這意味着My.Settings而不是Properties.Settings

回答

3

我可以回答你的問題,這部分:

有一行代碼,我需要當窗體關閉,節省了用戶的設置來執行?

應用程序設置存儲在您的Settings類中,位於Properties命名空間中。 Settings類具有一個名爲Default的靜態屬性,它表示您的應用程序的當前設置。因此,在主窗體的關閉事件中,您可以撥打:

Properties.Settings.Default.Save(); 

...保存設置。

同樣,您可以使用設置名稱Properties.Settings.Default.MyRadioButtonState(或任何您稱之爲的)以編程方式進入設置。

+0

謝謝!這讓我朝着正確的方向前進。在vb.net中,它是My.Settings而不是Properties.Settings.Default,但除此之外,它完美地工作。我現在只有一個設置,並在Load和FormClosing事件中使用表單的公共屬性。 – CoderDennis 2009-06-01 23:37:06

+0

在我的電腦上,關閉時不需要保存設置。它們會自動保存。唯一的問題是我必須點擊兩次。 – systemovich 2010-06-26 08:10:01

5

我回答你的問題,這部分:

如何消除在單選按鈕上單擊兩次的需求?

您可以在下面的事件處理程序添加到三個單選按鈕在分組框中(其中的Checked屬性綁定到應用程序設置)的Click事件:

Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click 
    If sender.Checked = False Then 
     sender.Checked = True 
    End If 
End Sub 

它的工作原理,甚至儘管在單擊它後需要半秒時間才能檢查未鎖定的RadioButton。

原因是在Surviving WinForms Databinding後的湍流Intelect的博客第5兩年前解釋(2008年)的問題(謝謝你,ohadsc,獲取相關鏈接):

第5 :不要綁定到點擊單選按鈕

我知道這將是多麼巨大的,如果你 可以只綁定無線電你幫 按鈕,一個枚舉屬性。我真的是 呢。你認爲你只是想把 掛鉤一些格式和解析事件 來轉換回你的枚舉,而 一切都會好的。如果它真的有效,它會很方便 。但是, WinForms只是不會被刪除。 現在有3個完整版本(或者是3.5 版本?),情況就是如此。 這是因爲事件順序,其中 不是MS可以去 切換,而不會導致開發人員的數千 得到真正奶酪 關閉。

真正的問題歸結爲 事實,不像其他控件的數據 性質,一個 單選按鈕的Checked屬性實際上並不改變 直到焦點離開單選按鈕。 並與所有的WinForms控制 焦點實際上並沒有離開單選 按鈕,直到焦點就轉移 陸續控制,而實際上直到 後的新 集中控制的Click事件已被解僱。結果這 ,因爲它涉及到無線電 按鈕,是,如果你嘗試綁定到 他們,在 數據源綁定的屬性實際上將一個 點擊滯後的 單選按鈕的視覺狀態。如果您只有兩個無線電按鈕,則數據源將爲 ,與可見狀態 完全相反,直到您單擊其他地方的 未觸發 引用這些數據源 屬性的操作。這可以使這個真正令人生氣的臭蟲追蹤下去。 我幾乎以爲我是幻覺。

現在,誠實地說,有可能 使它工作。但這是最糟糕的一種混合物。好吧,也許 這並不壞...但肯定是一個混亂的 黑客。對於確實應該 已經可用的東西,需要很多工作 。由於靠近我可以告訴 ,只有這樣,才能解決這個問題 不放棄 綁定機制是 本質上使自己的單選按鈕 控制,具有性能變化和 事件順序,實際上是有用的。 您可以從頭寫一個, 或子類單選按鈕並覆蓋 所有的事件邏輯的自定義 消息處理。

6

感謝Geoffrey Van Wyk和ohadsc(鏈接),我想出了以下自定義控件。它基本上是一個自定義框架,它將自動實現包含在其中的所有單選按鈕的Geoffrey代碼。好處是您現在可以使用ApplicationSettings來綁定控件的checked屬性,並且它將按照它應有的方式工作。

這裏是我的C#代碼,以使自定義控件:

public partial class RadioPanel : System.Windows.Forms.Panel 
    { 
     protected override void OnControlAdded(ControlEventArgs e) 
     { 
      base.OnControlAdded(e); 
      var radioButton = e.Control as RadioButton; 
      if (radioButton != null) 
       radioButton.Click += radioButton_Click; 
     } 

     void radioButton_Click(object sender, EventArgs e) 
     { 
      var radio = (RadioButton)sender; 
      if (!radio.Checked) 
       radio.Checked = true; 
     } 

    } 
相關問題