C# - 将checkList按钮与方法相关联

时间:2017-05-03 19:50:20

标签: c# winforms visual-studio

我创建了一个appliaction,用于删除不同目录中的文件。 我为每个目录制作了一个不同的方法。

在UI中,我希望用户选择要删除的目录。

使用复选框列表完成拣选,最终当用户选择他想要的所有目录时,他可以点击播放按钮。

我的问题是:这里的方法是什么? 是否可以将检查按钮与方法相关联? 或者我应该在播放按钮后面制作一个长分支代码吗?

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

    private Dictionary<string, Action> _selectedActions = null;

    private void Form1_Load(object sender, EventArgs e)
    {
        this.checkedListBox1.Items.Add("Apple");
        this.checkedListBox1.Items.Add("Banana");
        this.checkedListBox1.Items.Add("Cherry");

        _selectedActions = new Dictionary<string, Action>()
        {
            { "Apple", Apple },
            { "Banana", Banana },
            { "Cherry", Cherry },
        };
    }

    private void Apple() { MessageBox.Show("Ran Apple"); }
    private void Banana() { MessageBox.Show("Ran Banana"); }
    private void Cherry() { MessageBox.Show("Ran Cherry"); }

    private void button1_Click(object sender, EventArgs e)
    {
        foreach (var action in this.checkedListBox1
            .CheckedItems
            .Cast<string>()
            .Select(x => _selectedActions[x]))
        {
            action();
        }
    }

这种方法的重要部分是设置复选框项的代码部分也设置了Dictionary<string, Action>,这有助于防止名称与复选框项和字典键不匹配。在所有其他方面,此代码是强类型的。

答案 1 :(得分:-1)

如果CheckedListBox中的文件夹名称?匹配要运行的方法,然后您可以使用反射。例如,我列出了“cat”,“dog”和“fish”,并且可以运行相应的方法(如果选中),如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        foreach(string folder in checkedListBox1.CheckedItems)
        {
            System.Reflection.MethodInfo mi = this.GetType().GetMethod(folder, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            if (mi != null)
            {
                mi.Invoke(this, null);
            }
        }
    }

    private void cat()
    {
        Console.WriteLine("cat");
    }

    private void dog()
    {
        Console.WriteLine("dog");
    }

    private void fish()
    {
        Console.WriteLine("fish");
    }