我在groupBox中有一些radionButtons,我需要做一些我可以称之为"单选按钮之一"的操作,或者从单选按钮中找出哪个索引发生了变化。我试图在事件列表中找到它,但我找不到正确的。
编辑:为了更清楚:我需要知道是否存在一些Handel,我将为goupBox而不是单个radioButton编写处理程序方法。我知道如何使用radiButton.checkedChanged,但这不是我找到的..或者不同的是,我需要知道哪些选项具有 groupBox 来监视此 groupBox 内部发生的事情 - 我的意思是只有 groupBox 的处理程序。我发现处理程序"在组框中发生了什么事"或模拟(如果存在)。
它位于Visual Studio 2012的WFA(Windows演示应用程序)中。
我认为您要做的是将所有单选按钮的 CheckedChanged 事件连接到同一个处理程序。
public Form1()
{
radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
// ...
}
private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
RadioButton radioButton = sender as RadioButton;
if (radioButton1.Checked)
{
// Do stuff
}
else if (radioButton2.Checked)
{
// Do other stuff
}
}
据我所知,没有任何内置功能。
将标签属性设置为某种指示符(0 到 n)就可以了。
添加更改的检查处理程序
将所有按钮 CheckChanged 事件指向它。
然后类似的东西。
private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
RadioButton radioButton = sender as RadioButton;
int buttonid = (int)radioButton.Tag;
switch (buttonid)
{
case 0 : // do something; break
}
}
如果你有一些这样的,我会看看一个无线电组组件。
我遇到了同样的问题:一个名为按钮类型 (gbxButtonType) 的分组框带有 6 个单选按钮,另一个名为 Icon Type(gbxIconType) 的组框带有 8 个单选按钮。 当用户从每个分组框中选择一个单选按钮时,将显示一个消息框,其中在单击"显示按钮"后应用了所选内容。 我的问题是组框没有 CheckedChanged 事件。 AKN的解决方案运行良好:
public Form1()
{
InitializeComponent();
for (int i = 0; i < gbxButtonType.Controls.Count; i++)
{
RadioButton rdb = (RadioButton)gbxButtonType.Controls[i];
rdb.CheckedChanged += new System.EventHandler(gbxButtonType_CheckedChanged);
}
for (int i = 0; i < gbxIconType.Controls.Count; i++)
{
RadioButton rdb = (RadioButton)gbxIconType.Controls[i];
rdb.CheckedChanged += new System.EventHandler(gbxIconType_CheckedChanged);
}
}
private void gbxIconType_CheckedChanged(object sender, EventArgs e)
{
if (sender == rdbAsterisk)
{
iconType = MessageBoxIcon.Asterisk;
}
else if (sender == rdbError)
{
iconType = MessageBoxIcon.Error;
}
...
else
{
iconType = MessageBoxIcon.Warning;
}
}
类似于 davenewza 的回答(可能应该是一个评论,但我的声誉不足),但事件只为整个单选按钮组触发一次。
public Form1()
{
// Add a "CheckedChanged" event handler for each radio button.
// Ensure that all radio buttons are in the same groupbox control.
radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
}
private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
// Do stuff only if the radio button is checked (or the action will run twice).
if (((RadioButton)sender).Checked)
{
if (((RadioButton)sender) == radioButton1)
{
// Do stuff
}
else if (((RadioButton)sender) == radioButton2)
{
// Do other stuff
}
}
}
Groupbox 将限制仅选中一个单选按钮
所以 Setp1:您可以将一个"CheckedChanged"事件处理程序分配给所有单选按钮
private void initRadio()
{
radio_button1.CheckedChanged += Radio_show_CheckedChanged;
radio_button2.CheckedChanged +=Radio_show_CheckedChanged;
}
和 Setp2:像这样实现这个事件处理程序(按单选按钮的文本过滤)
private void Radio_show_CheckedChanged(object sender, EventArgs e)
{
RadioButton radioButton = sender as RadioButton;
if (radioButton.Checked == true) { //limited only checked button do function
switch (radioButton.Text)
{
case "name1":
// do your stuff ...
break;
case "name2":
// do your stuff ...
break;
}
}
}
System.Windows.Forms.RadioButton.CheckedChanged
是您需要的事件
所以做这样的事情:
public Form1()
{
InitializeComponent();
this.radioButton1.CheckedChanged += new EventHandler(radioButton1_CheckedChanged);
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
// your action
}
我认为您希望使用分组框控件本身来处理分组框中某些单选按钮的选择。
也许您希望这样做基本上是为了避免代码重复。
(即为设计器中的所有单选按钮添加检查更改事件,当有更多控件时,这可能会很乏味。既然它已经存在于一个组下,为什么不使用组控件对象来操作其中的控件并设置事件。
这就是我理解您的问题的方式,因此解决方案如下所示。
为分组框中的所有单选按钮控件设置通用处理程序
for (int i = 0; i < groupBox.Controls.Count; i++)
{
RadioButton rb = (RadioButton)groupBox.Controls[i];
rb.CheckedChanged += new System.EventHandler(evntHandler);
}
在处理程序中,您可以确定按其他人指示更改了哪个按钮,并执行必要的操作。
//Here You Go 由 Jock Frank Halliday 提供
//^subscribe events to radio button check changed
private void seriesTxtBxEvent()
{
//Show txtBx
this.radBtn_RoomSeries.CheckedChanged += new EventHandler(showSeriesTxtBx_Event);
//Hide txtBx
this.radBtn_RoomNumber.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
this.radBtn_RoomName.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
this.radBtn_RoomLevel.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
this.radBtn_RoomDep.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
}
private void hideSeriesTxtBx_Event(object sender, EventArgs e)
{
tbx_SheetSeries.Visible = false;
}
private void showSeriesTxtBx_Event(object sender, EventArgs e)
{
tbx_SheetSeries.Visible = true;
}
//Form Start
void MainFormLoad(object sender, EventArgs e)
{
Control.ControlCollection locais = groupBoxLocalização.Controls;
foreach (CheckBox chkBox in locais)
{
chkBox.MouseUp += chkBoxLocais_MouseUp;
}
}
// Event
void chkBoxLocais_MouseUp(object sender, MouseEventArgs e)
{
//Tratar individualmente
CheckBox chk = (CheckBox)sender;
//ou para tratar todos objetos de uma vez
Control.ControlCollection locais = groupBoxLocalização.Controls;
foreach (CheckBox chkBox in locais) {
//chkBox....
}
}
你也许可以用计时器来做到这一点,但这对优化不利,简单的解决方案是,对于每个单选按钮,你只需添加一个函数作为ChekedChanged事件。
- 创建已检查事件 通过双击任何单选按钮,复制 Visual Studio 为事件创建的方法的名称
- 转到所有单选按钮,然后将事件更改为从属性资源管理器>事件部分复制的事件
- 在生成的方法中,使用以下代码。这将触发所有单选按钮的事件,但只触发一次"做你的事"
法典:
private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
if (rb.Checked == false) return;
// Do your thing
}
-
在设计器事件列表中的一个单选按钮上创建事件Checked_Changed。
-
从Checked_Changed前面的下拉列表中将相同的事件添加到每个单选按钮每个电台的事件
-
内部已检查更改事件使用
private void CheckedChanged(object sender,EventArgs e) { var radio = groupBox.Controls.OfType<RadioButton> ().FirstOrDefault(r => r.Checked).Name; }
您现在可以获取哪个收音机处于活动状态。