C# 中带有单选按钮的 groupBox 的事件处理程序
Posted
技术标签:
【中文标题】C# 中带有单选按钮的 groupBox 的事件处理程序【英文标题】:Event handler for groupBox with radioButtons in C# 【发布时间】:2012-06-25 00:17:17 【问题描述】:我在 groupBox 中有一些 radionButtons,我需要执行我可以称之为“radionbuttons.checked 之一已更改”的操作,或者从 radiobutton 中找出更改的索引。 我试图在事件列表中找到它,但找不到合适的。
编辑: 为了更清楚:我需要知道是否存在一些handel,我将为goupBox而不是单个radioButton编写处理程序方法。我知道如何使用 radiButton.checkedChanged,但这不是我发现的.. 或者不同的是,我需要知道 groupBox 有哪些选项可以监控这个 groupBox 内部发生的事情——我的意思是只有 groupBox 的处理程序。我正在寻找处理程序“在组框中发生了什么事”或类似的情况(如果存在)。
它位于 Visual Studio 2012 的 WFA(Windows 演示应用程序)中。
【问题讨论】:
您可能希望在问题主题或标签中从 WPF 开始。也标记不正确。 除了它不是 WPF 而是 WFA,为什么要提到它这么重要?如果我在 C# 中编写的内容还不清楚,那么 C# 中的事件处理是否存在一些差异?我想如果它是一种编程语言,它应该是相同的(这对我来说似乎是合乎逻辑的,我没有任何信息不是 - 但我也没有任何信息,所以我问你是因为你有问题与它)。 问题下也只能有5个标签... 是的,我正在使用 WPF,不,你不是,但谢谢。我已经在为单个单选按钮使用选中的更改。我需要知道是否存在类似“groupBox 中某个对象的值已更改”之类的东西 - 我的意思是 groupBox 的事件处理程序而不是 radioButtons ......也许它没有...... – user1097772 3 小时前 【参考方案1】:我认为您想要做的是将所有 RadioButtons 的 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
【讨论】:
顺便说一句,我假设您使用的是 WinForms。 这不会触发事件两次吗?一次用于旧的选定单选按钮,一次用于新的?因为两者都改变了价值,对吧? @Enrico 我刚刚测试了它,是的。因此,如果您不希望这种情况发生,那么 Click 事件可能会更好。通过测试查看现在选中的单选按钮与之前选择的单选按钮不同。此外,单击会在表单加载时自动运行一次(不仅仅是单击!),但它会在表单处于活动状态之前发生。因此,在 click 方法中,您可以测试表单是否曾经被激活(激活表单时将布尔值设置为 true),在 click 方法中,测试布尔值是否为真,然后运行您想要的代码点击方法 当前语法是radioButton1.CheckedChanged += radioButtons_CheckedChanged;
无需将新的 EventHandler 包裹起来,即无需说 radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
【参考方案2】:
据我所知,没有任何内置功能。
将标签属性设置为某种指示符(0 到 n)即可。
添加一个 CheckChangedHandler
将所有按钮 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
如果你有其中的一些,我会看一下 radiogroup 组件。
【讨论】:
谢谢,但这是我目前的解决方案。但是没有radioGroup组件,组件列表中只有组框。所以我正在为 groupBox 找到一些事件处理程序。 没有。所有 groupbox 所做的只是包含带有边框和标题的其他组件。我可以给你一些关于如何创建无线电组组件或扩展组框的想法。无法想出一个不存在的行为。【参考方案3】:我遇到了同样的问题:一个名为 Button Type (gbxButtonType) 的组合框有 6 个单选按钮和另一个名为 Icon Type 的组合框(gbxIconType) 带有 8 个单选按钮。当用户从每个组框中选择一个单选按钮时,将出现一个消息框,并在单击 DisplayButton 后应用该选择。我的问题是组框没有 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;
【讨论】:
【参考方案4】:与 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
【讨论】:
【参考方案5】: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
【讨论】:
假设您使用的是 WinForms 和开箱即用的标准控件,并假设我正确解释了您的问题 是的,我正在使用 WPF,不,你不是,但谢谢。我已经在为单个单选按钮使用选中的更改。我需要知道是否存在类似“groupBox 中某个对象的值已更改”之类的东西 - 我的意思是 groupBox 的事件处理程序而不是 radioButtons ......也许它没有......【参考方案6】: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;
【讨论】:
【参考方案7】:我认为您希望使用 groupbox 控件本身来处理 groupbox 内某些单选按钮的选择。
可能你想要这个基本上是为了避免代码重复。
(即)为设计器中的所有单选按钮添加检查更改事件,当有更多控制时可能会很乏味。 既然它已经存在于一个组下,为什么不使用组控件对象来操作其中的控件并设置事件。
这就是我理解您的问题的方式,因此得到了如下所示的解决方案。
为组框中的所有单选按钮控件设置一个通用处理程序
for (int i = 0; i < groupBox.Controls.Count; i++)
RadioButton rb = (RadioButton)groupBox.Controls[i];
rb.CheckedChanged += new System.EventHandler(evntHandler);
在处理程序中,您可以根据其他人的指示确定更改了哪个按钮并执行必要的操作。
【讨论】:
【参考方案8】://这是乔克·弗兰克·哈利戴的礼貌
//^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;
【讨论】:
【参考方案9】://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....
【讨论】:
【参考方案10】:您也许可以使用 Timer 来实现,但这不利于优化,简单的解决方案是,您只需为每个单选按钮添加一个函数作为 ChekedChanged 事件。
【讨论】:
【参考方案11】:-
通过双击任何单选按钮创建 Checked 事件,复制 Visual Studio 为该事件创建的方法的名称
转到所有单选按钮并将事件更改为从“属性资源管理器”>“事件部分”复制的事件
在生成的方法中使用以下代码。这会触发所有单选按钮的事件,但只会触发一次“做你的事”
代码:
private void radioButtons_CheckedChanged (object sender, EventArgs e)
RadioButton rb = sender as RadioButton;
if (rb.Checked == false) return;
// Do your thing
【讨论】:
【参考方案12】:在设计器事件列表中的一个单选按钮上创建事件 Checked_Changed。
从 Checked_Changed 前面的下拉列表中为每个单选按钮添加相同的事件 每个电台的事件
内部检查更改事件使用
private void CheckedChanged(object sender,EventArgs e)
var radio = groupBox.Controls.OfType<RadioButton>
().FirstOrDefault(r => r.Checked).Name;
你可以知道哪个收音机现在处于活动状态。
【讨论】:
以上是关于C# 中带有单选按钮的 groupBox 的事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在UnChecked时触发单选按钮的OnChange事件