我创建了一个appliaction,用于删除不同目录中的文件。 我为每个目录制作了一个不同的方法。
在UI中,我希望用户选择要删除的目录。
使用复选框列表完成拣选,最终当用户选择他想要的所有目录时,他可以点击播放按钮。
我的问题是:这里的方法是什么? 是否可以将检查按钮与方法相关联? 或者我应该在播放按钮后面制作一个长分支代码吗?
答案 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");
}