7

背景

.NET Windows フォーム(2.0) では、ラジオ ボタンは、フォーム、パネル、またはグループ ボックスのいずれであっても、コンテナ コントロールによって自動的にグループ化されます。

つまり、1 つのラジオ ボタンを選択すると、同じコンテナー内の他のすべてのラジオ ボタンが自動的にオフの状態に変更されます。

ここで、次のフォーム レイアウトを検討してください。

MUST HAVE  NICE TO HAVE  DESCRIPTION
---------  ------------  -----------------------------------------------
   [ ]          [ ]      The gizmo works
   [ ]          [ ]      The gizmo works beautifully
   [ ]          [ ]      The gizmo works amazingly and makes you breakfast
   [ ]          [ ]      The gizmo comes with a pony
  • それぞれ'[ ]'がラジオボタンです。
  • ユーザーは、列 1 で必須の回答を選択し、列 2 でオプション(望ましい、最良の回答) を選択するように求められます。

ご覧のとおり、ラジオ ボタンは列ごとにグループ化する必要があります。ラジオの 1 つを選択すると、残りの列はクリアされますが、他の列には影響しません。

問題

基本的に問題は、これが動的に生成されたフォームであることです。

  • レイアウト内の行数は動的であり、構成可能なフォーム定義からロードされます。
  • 説明テキストは実行時まで不明であり、長さは大きく異なります (2、3 語しかないものもあれば、数十行になるものもあります)。
  • レイアウトの再設計はできません。これは、何年も使用されてきたこのフォームの紙のバージョンに (非技術者の) ユーザーが慣れ親しんでいることに由来します。このフォームも印刷されます。フォームの入力システムを変更したとしても、「古い」レイアウトで印刷するために別のバージョンをコーディングする必要があります。

私が試してうまくいかなかったこと

最初にこれを動的に生成されたレイアウトとして実装しようとしました。3 つのパネル (列ごとに 1 つずつ) を使用して、ラジオ ボタンの自動グループ化が問題なく機能するようにしました。そして、それはしました。

しかし、ラジオ ボタンとそのテキストとの間の水平方向の配置に関連するレイアウトの問題は、私を殺しています。テキストのサイズは実行時まで不明であり、テキスト行が折り返される場合があります (項目ごとに数回繰り返される場合もあります)。ちゃんと合う時もあるし、合わない時もある。これのデバッグを開始しようとしていますが、この 3 パネルの実装を変更する方が良いオプションではないかと考えています。

私がやろうとしていること

配置関連の問題を簡素化するために、3 つの列を持つを使用してレイアウトを再設計したいのですTableLayoutPanelが、それはコンテナごとの自動ラジオ ボタン グループ化機能を使用できないことを意味します。

編集:

Gerrie が提案したように、他のレイアウト オプションは、各行をユーザー コントロールとして実装し、フロー レイアウト パネルを使用することです。

つまり、レイアウトにはコントロールを使用したいが、ラジオ ボタンのグループ化には使用したくないということです。

水平方向のユーザー コントロールを使用しているにもかかわらず、垂直方向のラジオ ボタン グループを取得する必要があります。

/編集

私が尋ねようとしていること

ラジオ ボタンのグループ化を手動で制御する方法について、指針と提案が必要です。必要に応じて、クラスをサブクラス化してもかまいませんRadioButton

具体的には、「RadioButton」をサブクラス化する「標準的な」方法または既知の方法があるか、または Win32 API に至るまで、コントロールがチェックされるたびに (マウス、キーボードの Enter、スペースバー、およびその他の方法を使用して)自動グループ化機能が「非アクティブ」であることがよく知られている方法で、イベントをトラップし、フォーム上の他のすべてのコントロールの状態を手動で更新できますか? 実装もコンテナ関連なので、Panel? のサブクラス化を余儀なくされるのではないかと心配しています。

グループ化の「魔法」は Windows フォームでどのように機能しますか?

カスタムラジオボタングループまたは「ラジオボタンリスト」を実装するグーグルで見つけたすべてのソリューションは、何らかの方法でグループのコンテナを使用することに基づいています。コンテナは避けることができますか?もしそうなら、どのように?

4

2 に答える 2

6

私が見つけた一時的な解決策(読み取り:乱雑なハック)は、すべてのラジオボタンをそれぞれの小さなパネルに配置することです。そのため、それらの間でグループ化はまったく行われません。すべてのボタン イベントをリッスンし、checkedそれに応じて適切なイベントを更新しています。

これだけ多くのパネルを用意するのはやり過ぎだと今でも思っています。

(わかりました、私自身の質問に答えてすみません。時間をかけて何かを説明すると、問題が別の光で見え始めます。)

于 2009-02-23T09:14:55.470 に答える
1

私はシンプルで簡単な解決策を探します。たとえば、1 つの線を表すカスタム コントロール (つまり、2 つのラジオ ボタンと 1 つのラベル)。

編集:わかりました、私は今あなたの要件を理解していると思います. ラジオボタンの 2 つのコレクション (列 A のコレクションと列 B のコレクション) を持つことはできませんか?

フォームが描画されたら、それらを 2 つの List<RadioButton> などに追加し、2 つの個別のイベント (columnARBChecked、columnBRBChecked) にバインドします。イベントの 1 つが発生すると、いくつかのロジックを呼び出して、残りのラジオボタンを必要に応じてオン/オフにすることができます。

于 2009-02-23T08:41:37.220 に答える