2013-06-03 6 views
0

Довольно глупый вопрос, но все еще раздражает.Радиолюбители в разных групповых ящиках

Дело в том, что у меня есть два групповых ящика, где заголовки имеют радиокнопки, покрывающие названия групп.

Что-то вроде

(x) I want pizza 
*Pizza stuff* 

() I want Hamburger 
*Hamburger stuff* 

Поскольку теперь они в разных коробках группы, они оба могут быть выбраны. Есть ли способ установить/заставить радиокнопки находиться в одной и той же «группе»? Как и в HTML, где вы установили name="WhatToEat" value="Pizza" для первого значения, а затем name="WhatToEat" value="Hamburger"

Или может я установить заголовок для GroupBox вести себя как кнопка радио или что-то?

Конечно, у меня может быть радиокнопка за пределами ящиков grop, но я думаю, что названия в качестве радиолюбителей просто имеют наибольший смысл и выглядят лучше.

ответ

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, но это немного.

Надеюсь, это поможет!

+0

Это действительно приятное решение! – gubbfett

+0

Спасибо! Это то, что я сделал, когда сталкивался с проблемой, подобной твоей. :) –

+0

Я не понимаю: «Если у вас все ваши RadioButtons на форме». Если все RadioButtons находятся в Форме, то все они находятся в одной группе, и они уже демонстрируют это поведение. Зачем вам нужен код, чтобы снять флажок с последнего RadioButton? ... они уже делают это сами! –

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 
+0

Это используется только для 2-х радиокнопок, общий ответ должен решить общий случай, когда имеется много радиообъектов. –

+0

Да, это на самом деле то, что я придумал, задав этот вопрос. Это не кажется правильным, но я думаю, что в этом случае я должен пойти с этой душой. thx :) – gubbfett

+0

@KingKing Да, вот что я имею в виду. Для этого нужно кое-что сделать. Если радиопульты были сгенерированы каким-то контуром, это был бы еще один раздражающий цикл для проверки того, что проверяется радиообъект. – gubbfett

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

Я не думаю, что это рекомендуется для использования цикла, когда мы можем его избежать. –

+0

@KingKing Уточните, почему? –

+0

Пожалуйста, см. Мой ответ, чтобы понять, почему я говорю, что использование Loop в этом случае не рекомендуется. Благодаря! –

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

* Вы можете поместить значение в свойство Tag() каждого RadioButton, который должен быть «название », а затем искать их вместо жесткого кодирования в массив. Или, может быть, вы могли бы назвать их определенным образом.

EDIT: Вы могли бы сделать «заголовок» Radiobuttons включить/отключить связанные с ними рамок группы, когда они проверяются так: RadioButton GroupBox Title

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 
+0

Также хорошее решение! – gubbfett

Смежные вопросы