C#Execute Method for selected CheckBoxes。每个CheckBox的不同方法

时间:2018-01-12 05:36:38

标签: c# winforms checkbox methods

所以我在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

    }

任何帮助都得到了很多赞赏

2 个答案:

答案 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);
        }