所以我在Form上有一堆CheckBoxes,底部有一个Button,我想点击它,然后执行那些Checked CheckBox的方法。
每个CheckBox都将使用自己的方法。
似乎像一个普通/简单的事情。然而,我发现在一个事件中处理多个CheckBox时没有什么太有用的搜索。
我对编程比较陌生,而且我自己学习。
Idk如果有一个简单的for或foreach循环我可以与其他东西一起使用来使这更简单,但我甚至不知道还有很长的路要走...
所有我能想到的是按钮点击事件下的一堆if语句,以测试是否选中,如果是,则运行方法。但是,这似乎是错误的做法。
private void btnExecutedSelected_Click(object sender, EventArgs e)
{
if (ChkBox_Test.Checked == true)
{
ClassName.MethodName();
}
//Then an if statement for each CheckBox
}
任何帮助都得到了很多赞赏
答案 0 :(得分:1)
有几种方法可以解决这个问题,通常最好的方法更先进一些,但这是一个学习代表基础知识的好机会,就像变量和方法/函数之间的混合。现在,把它们想象成Monopoly中的卡片,告诉你直接进入监狱。卡本身并不是什么东西,除了你拿起的指令。当您使用/读取卡时,您必须遵循生成的指令,即进入监狱。代表们有点像那些卡片。
要了解它们的工作原理,请创建一个新的Winforms应用程序,在表单和按钮上放置4个复选框。不要担心重命名它们。然后添加以下代码:
// This defines the "monopoly cards"
// Community Chest cards give or take money, so we'll expect an int to be returned
public delegate int CommunityChestCard();
// Chance cards just do things without any return values
public delegate void ChanceCard();
private void Form1_Load(object sender, EventArgs e)
{
checkBox1.Tag = new ChanceCard(GoDirectlyToJail);
checkBox2.Tag = new ChanceCard(AdvanceToGo);
checkBox3.Tag = new CommunityChestCard(WinBeautyContest);
checkBox4.Tag = new CommunityChestCard(PayDoctorsFees);
}
private void GoDirectlyToJail()
{
MessageBox.Show("You went to jail!");
}
private void AdvanceToGo()
{
MessageBox.Show("You advanced to Go!");
}
private int WinBeautyContest()
{
MessageBox.Show("You won $20 in a beauty contest!");
return 20;
}
private int PayDoctorsFees()
{
MessageBox.Show("You had to pay $50 in doctor's fees!");
return -50;
}
// Now when we click the button, we'll loop through our checkboxes,
// see which ones were checked, and then execute the methods defined
// in the associated chance/communitychest cards.
private void button1_Click(object sender, EventArgs e)
{
// this.Controls is a collection of the child controls on the current form
foreach(Control ctl in this.Controls)
{
// See if the control is a CheckBox
if(ctl is CheckBox)
{
// It is - let's cast it for easier coding...
CheckBox chk = (CheckBox)ctl;
// Is it checked?
if (chk.Checked)
{
// Yep! Does it have a value in its Tag?
if (chk.Tag != null)
{
if(chk.Tag is CommunityChestCard)
{
CommunityChestCard ccCard = (CommunityChestCard)chk.Tag;
// Call the function on the card and get the result
int adjustMoneyByAmount = ccCard();
}
else if(chk.Tag is ChanceCard)
{
ChanceCard cCard = (ChanceCard)chk.Tag;
// Call the function on the card
cCard();
}
}
}
}
}
}
现在,只是一些警告的话 - 我使用Tag属性作为快速修复,以减少额外的编码以用于说明目的。随着代码和自定义/扩展控件的改进,您可能希望拥有适合这些类型的正确类型属性。使用Tag不是一个优雅的解决方案。
如果按照描述运行该代码,您应该能够检查一些复选框并单击按钮,看看正在执行的结果函数。
我还建议不要只循环遍历表单上的所有控件,并检查它们是否是复选框。你似乎在循环控件方面遇到了一些麻烦,所以这种方法就是一个例子。复选框可以通过多种不同方式组合在一起。您可以考虑使用List对象并将复选框添加到该列表中。这样,您可以稍后循环浏览该List,并且您将确切地知道您正在处理哪些控件(没有丑陋的转换或检查控件是否是复选框)。
答案 1 :(得分:0)
您可以这样做:
private void CheckBoxOperations(Control parentControl)
{
foreach (Control c in parentControl.Controls)
{
if (c is CheckBox)
{
if (((CheckBox)c).Checked)
{
//DoSomething
}
}
if (c.HasChildren)
{
CheckBoxOperations(c);
}
}
}
private void btnExecutedSelected_Click(object sender, EventArgs e)
{
CheckBoxOperations(this);
}