5

3 つのラジオ ボタンを含む WinForms ダイアログ ボックスがあります。ApplicationSettingsこれらの各コントロールの Checked プロパティをバインドするために使用しRadioButtonていますが、期待どおりの動作をしません。チェックされる前に各ラジオ ボタンを 2 回クリックする必要があり、選択したラジオ ボタンは保持されません。

ユーザー設定を保存するためにフォームが閉じられたときに実行する必要があるコード行はありますか?

ラジオ ボタンを 2 回クリックする必要をなくすにはどうすればよいですか?

このタイプのユーザー設定を保持するためのより良い方法はありますか? ダイアログ ボックス クラスに、チェックされているラジオ ボタンに基づいて列挙値を取得/設定するパブリック プロパティがありますが、そのプロパティをユーザー設定にバインドする簡単な方法がわかりませんでした。

編集: vb.netを使用していることを指定する必要がありました。My.Settingsの代わりにという意味だと思いますProperties.Settings

4

4 に答える 4

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;
        }

    }
于 2011-08-02T14:32:58.810 に答える
6

私はあなたの質問のこの部分に答えます:

ラジオ ボタンを 2 回クリックする必要をなくすにはどうすればよいですか?

次のイベント ハンドラーを、GroupBox 内の 3 つの RadioButton (Checked プロパティが Application Settings にバインドされている) のそれぞれの 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 がチェックされるまでに 0.5 秒かかりますが、機能します。

この問題の理由は、2 年前 (2008 年) 、Turbulent Intelect ブログのSurviving WinForms Databinding 投稿のセクション 5 で説明されました (リンクについては、 ohadscに感謝します)。

ルール 5: クリック可能なラジオ ボタンにバインドしない

一連のラジオ ボタンを列挙型プロパティにバインドできれば、どんなに素晴らしいことでしょう。本当です。Format イベントと Parse イベントをフックして列挙型に戻すだけで、すべてうまくいくと思います。実際に機能するなら、とても便利です。しかし、WinForms はこれには向いていません。現在 3 つのフル リリース (または 3.5 リリースですか?) では、これが当てはまります。これは、イベントの順序が原因であり、MS が何千人もの開発者を本当に怒らせることなく切り替えることができるものではありません。

問題は、他のコントロールのデータ プロパティとは異なり、フォーカスがラジオ ボタンから離れるまで、ラジオ ボタンの Checked プロパティが実際には変化しないという事実に帰着します。そして、すべての WinForms コントロールと同様に、フォーカスが別のコントロールに与えられるまで、実際にはフォーカスがラジオ ボタンから離れることはなく、実際には、新しくフォーカスされたコントロールの Click イベントが発生するまで続きます。この結果、ラジオ ボタンに関連するため、それらにバインドしようとすると、データソースのバインドされたプロパティは、実際にはラジオ ボタンの表示状態より 1 クリック遅れます。. ラジオ ボタンが 2 つしかない場合、データソース プロパティを参照するアクションをトリガーしない別の場所をクリックするまで、データソースは表示状態の正反対になります。これは、追跡するのが本当に腹立たしいバグになる可能性があります。幻覚かと思いました。

さて、正直なところ、それを機能させることは可能です。しかし、それはこれまでにクラッジされた中で最もクラッジなクラッジです。それほど悪くはないかもしれませんが、確かに厄介なハックです。本当にすでに利用可能になっているはずのものを手に入れるには、多くの作業が必要です。私が知る限り、データ バインディング メカニズムをあきらめずにこの問題を解決する唯一の方法は、実際に役立つプロパティ変更とイベント順序を使用して、本質的に独自の RadioButton コントロールを作成することです。ゼロから作成するか、RadioButton をサブクラス化し、すべてのイベント ロジックをカスタム メッセージ処理でオーバーライドすることができます。

于 2010-06-26T12:00:27.650 に答える
3

この動作は、項目 5 で説明されています。

http://turbulentintellect.blogspot.com/2008/07/surviving-winforms-databinding.html

考えられる解決策の 1 つはカスタム GroupGox です: WinForms でラジオボタンのグループをデータバインドする最良の方法

于 2010-03-06T17:42:50.400 に答える
3

あなたの質問のこの部分に答えることができます:

ユーザー設定を保存するためにフォームが閉じられたときに実行する必要があるコード行はありますか?

アプリケーション設定は、名前空間Settingsのクラスに保存されます。Propertiesこのクラスには、アプリケーションの現在の設定を表すSettingsという静的プロパティがあります。Defaultしたがって、メイン フォームの Closing イベントで、次のように呼び出します。

Properties.Settings.Default.Save();

... 設定を保存します。

Properties.Settings.Default.MyRadioButtonState同様に、設定の名前(または任意の名前)を使用して、プログラムで設定にアクセスできます。

于 2009-06-01T23:25:38.483 に答える