我在C#窗体中的事件处理程序的上下文中讨论,但我假设答案可以在C#中的任何地方使用.
举个例子,我有一个表单,其中有许多复选框,每个复选框都激活一个按钮.CheckedChanged事件由一个与每个CheckBox非常相似的函数处理,它现在看起来像这样:
private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
int uniquetocheckbox = 12345;
if(acheckbox.CheckedChanged)
{
ThisFunction(uniquetocheckbox, true);
AssociatedButton.Enabled = true;
}
else
{
ThisFunction(uniquetocheckbox, false);
AssociatedButton.Enabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
有很多这些复选框,我正在尝试剪切并通过每个代码,并尽可能少做更改,所以我想做这样的事情:
private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
int uniquetocheckbox = 12345;
if((CheckBox)sender.Checked) //CHANGE HERE
{
ThisFunction(uniquetocheckbox, true);
AssociatedButton.Enabled = true;
}
else
{
ThisFunction(uniquetocheckbox, false);
AssociatedButton.Enabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.简单的解决方法是:
private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
int uniquetocheckbox = 12345;
CheckBox cb = (CheckBox)sender;
if(cb.Checked) //CHANGE HERE
{
ThisFunction(uniquetocheckbox, true);
AssociatedButton.Enabled = true;
}
else
{
ThisFunction(uniquetocheckbox, false);
AssociatedButton.Enabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
但出于纯粹的好奇心,我想知道是否有办法在一行中完成,就像我给出的第二个例子.我想知道,因为我觉得它看起来更好,显然缩短了1行.
我想你只是缺少一套括号.你想要转换为Checkbox,然后获取该属性:
if (((CheckBox)sender).Checked)
Run Code Online (Sandbox Code Playgroud)
这将强制执行操作的顺序,然后从转换结果中获取属性.