Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-将检查表按钮与方法关联_C#_Winforms_Visual Studio - Fatal编程技术网

C# C-将检查表按钮与方法关联

C# C-将检查表按钮与方法关联,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我创建了一个从不同目录删除文件的应用程序。 我为每个目录制定了不同的方法 在UI中,我希望用户选择要删除的目录 选择是通过复选框列表完成的,最终当用户选择所有他想要清空的目录时,他可以点击播放按钮 我的问题是:什么是正确的方法? 是否可以将检查按钮与方法关联? 或者我应该在“播放”按钮后面生成一个长的分支代码吗?如果选中列表框中的文件夹名称是?匹配要运行的方法,然后可以使用反射。例如,我列出了cat、dog和fish,并可以在如下方式选中时运行相应的方法: private void bu

我创建了一个从不同目录删除文件的应用程序。 我为每个目录制定了不同的方法

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

选择是通过复选框列表完成的,最终当用户选择所有他想要清空的目录时,他可以点击播放按钮

我的问题是:什么是正确的方法? 是否可以将检查按钮与方法关联?
或者我应该在“播放”按钮后面生成一个长的分支代码吗?

如果选中列表框中的文件夹名称是?匹配要运行的方法,然后可以使用反射。例如,我列出了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");
    }

我会做这样的事情:

    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();
        }
    }

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

您的目标是什么:Winforms、WPF、ASP。。?始终正确标记您的问题!检查清单事件。对我来说,关键问题是:为什么你为每个目录制定了不同的方法?是否有什么东西禁止您将删除文件功能概括为某种函数,即使该函数需要某种参数?方法不同。每个方法都从用户目录接收计算机名或所有用户的数组。每种方法都有一条不同的路径,只有它们的基本名称(即pc名称)是所有方法所共有的。在某些方法中,您不能只是删除文件,还需要进行一些检查。我没有时间将此形式化为欢迎任何其他人使用的答案,但您需要研究获取包含函数的变量的方法,以及作为每个winforms控件的一部分,该控件包含与该控件关联的对象。使用这两个选项,您可以使单击“播放”按钮循环浏览所有选中的项目,并调用标记中的Func。是否要评论?…这看起来比我的想法好,非常感谢: