0

かなりばかげた質問ですが、それでも迷惑です。

問題は、タイトルにグループ ボックスのタイトルをカバーするラジオボタンがある 2 つのグループ ボックスがあることです。

何かのようなもの

(x) I want pizza
*Pizza stuff*

( ) I want Hamburger
*Hamburger stuff*

これらは別のグループ ボックスにあるため、両方を選択できます。ラジオボタンを同じ「グループ」に設定/強制する方法はありますか? HTML のように name="WhatToEat" value="Pizza"、最初の値を設定してから name="WhatToEat" value="Hamburger"

または、グループボックスのタイトルをラジオボタンなどのように設定できますか?

もちろん、グループ ボックスの外にラジオ ボタンを配置することもできますが、タイトルをラジオ ボタンとして配置するのが最も理にかなっており、見栄えも良いと思います。

4

5 に答える 5

3

フォームにすべての RadioButtons がある場合。RadioButton 変数を使用して、現在チェックされているものをマークできます。ユーザーが RadioButton をチェックするたびに、それが現在チェックされている RadioButton でない場合は、現在チェックされている RadioButton をチェック解除し、現在チェックされている RadioButton をその RadioButton に設定します。

これが私のコードです:

public Form1(){
  InitializeComponents();
  currentChecked = radioButton1;
}
//Suppose the initially checked radio is radioButton1
RadioButton currentChecked;
//This is the CheckedChanged event handler used for all the radiobuttons
private void radioButtonChecked(object sender, EventArgs e)
{
        RadioButton r = (RadioButton)sender;
        if (r != currentChecked)
        {
            currentChecked.Checked = false;
            currentChecked = r;
        }
}

私のコードは、ループを使用しない方がずっと簡単です。追加料金がかかりますが、currentCheckedそれほど多くはありません。

それが役に立てば幸い!

于 2013-06-03T14:42:04.210 に答える
1

実行時にフォームに移動するだけです。PointToScreen() と PointToClient() を使用して、設計時に配置したのと同じ位置に保持します。したがって、「RadioButton1」、「RadioButton2」、および「RadioButton3」をタイトルの RadioButtons に置き換えます。

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim RadioTitles() As RadioButton = {RadioButton1, RadioButton2, RadioButton3}
    For Each rb As RadioButton In RadioTitles
        Dim pt As Point = Me.PointToClient(rb.PointToScreen(New Point(0, 0)))
        Me.Controls.Add(rb)
        rb.Location = pt
        rb.BringToFront()
    Next
End Sub

*「タイトル」となる各 RadioButton の Tag() プロパティに値を入力し、配列にハードコーディングする代わりにそれらを検索することができます。または、特定の方法で名前を付けることができます。

編集:次のようにチェックされている場合、「タイトル」RadioButtons が関連付けられている GroupBoxes を有効/無効にすることができます。 ラジオボタン グループボックスのタイトル

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim RadioTitles() As RadioButton = {RadioButton1, RadioButton2, RadioButton3}
    For Each rb As RadioButton In RadioTitles
        rb.Parent.Enabled = False
        rb.Tag = rb.Parent
        AddHandler rb.CheckedChanged, AddressOf TitleRadioButtons_CheckedChanged

        Dim pt As Point = Me.PointToClient(rb.PointToScreen(New Point(0, 0)))
        Me.Controls.Add(rb)
        rb.Location = pt
        rb.BringToFront()
    Next
End Sub

Private Sub TitleRadioButtons_CheckedChanged(sender As Object, e As System.EventArgs)
    Dim rb As RadioButton = DirectCast(sender, RadioButton)
    If Not IsNothing(rb.Tag) AndAlso TypeOf rb.Tag Is Control Then
        Dim ctl As Control = DirectCast(rb.Tag, Control)
        ctl.Enabled = rb.Checked
    End If
End Sub
于 2013-06-03T14:51:36.370 に答える
1

いいえ、それは 1 つのグループである必要があります..

ただし、その場合はchecked_changeイベントで制御できます

Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
    RadioButton1.Checked = Not RadioButton2.Checked
End Sub

Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
    RadioButton2.Checked = Not RadioButton1.Checked
End Sub
于 2013-06-03T14:13:53.697 に答える
0

残念ながら、それはラジオ ボタンの仕組みではありません。

ご承知のとおり、ラジオ ボタンはコンテナーからグループ化されます。 私の知る限り、求めていることを達成できるようにしたい場合は、おそらくカスタム ソリューションをコーディングする必要があります。たとえば、各ラジオ ボタンにイベント ハンドラを配置して、同じイベントを発生させて他のボックスのチェックを外すことができます。

radioButton1.CheckedChanged += anyRadioButton_CheckedChanged;
radioButton2.CheckedChanged += anyRadioButton_CheckedChanged;
radioButton3.CheckedChanged += anyRadioButton_CheckedChanged;

...

private void anyRadioButton_CheckedChanged(object sender, EventArgs e)
{
    foreach (var control in this.Controls)
    {
        if(control is GroupBox)
        {
            foreach (var childControl in ((GroupBox)control).Controls)
            {
                if (childControl is RadioButton && childControl != sender)
                {
                    ((RadioButton)childControl).Checked = false;
                }
            }
        }
    }
}
于 2013-06-03T14:14:31.857 に答える
0

のテキストGroupBoxを空の文字列に設定して、そのRadioButton上に置くことができます。トリックは、実際にフォームに配置することですが、 の一部のように見えるように移動しGroupBoxます。ただし、グループ ボックスが静的で移動しない場合にのみ、これで十分です。それ以外の場合は、@matzone が提案したソリューションを使用することをお勧めします。ただし、その場合でも、コード内のコレクションにすべてのラジオ ボタンを配置し、それらすべてに対して唯一のイベント ハンドラーを使用できます。何かのようなもの

private List<RadioButton> radioButtons;

public YourFormConstructor()
{
    InitializeComponent();
    radioButtons.Add(radio1);
    radioButtons.Add(radio2);
    radioButtons.Add(radio3);
    foreach (var radio in radioButtons)
        radio.CheckedChanged += RadioCheckedChanged;
}

private void CheckedChanged(object sender, EventArgs e)
{
    var thisRadio = sender as RadioButton;
    if (!thisRadio.Checked)
        return;
    foreach (var radio in radioButtons)
        if (radio != thisRadio)
            radio.Checked = false;
}
于 2013-06-03T14:16:32.777 に答える