相当愚蠢的问题,但仍然很烦人。
问题在于我有两个组合框,其中标题具有覆盖组合框标题的单选按钮。
像
这样的东西(x) I want pizza
*Pizza stuff*
( ) I want Hamburger
*Hamburger stuff*
由于它们现在位于不同的组框中,因此可以选择它们。
有没有办法设置/强制radiobuttons在同一“组”?就像你设置的HTML一样
首先是name="WhatToEat" value="Pizza"
,然后是第一个值
name="WhatToEat" value="Hamburger"
或者我可以将组合框的标题设置为单选按钮或类似的东西吗?
当然我可以在grop框外面使用单选按钮,但我认为将标题作为radiobutton只是最有意义并且看起来更好。
答案 0 :(得分: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
,但并不多。
希望它有所帮助!
答案 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
答案 2 :(得分:1)
只需在运行时将它们移动到表单即可。使用PointToScreen()和PointToClient()将它们保持在与设置时相同的位置。所以你用你的标题RadioButtons替换“RadioButton1”,“RadioButton2”和“RadioButton3”:
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在检查它们时启用/禁用它们的相关GroupBox:
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
答案 3 :(得分: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;
}
}
}
}
}
答案 4 :(得分: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;
}