我编写了一个程序,它递归地遍历一个目录,通过文件夹浏览器对话框选择,并对其中的所有文件和所有子目录进行清查。对于每个文件,我创建了一个file对象,并赋予它名称、路径和创建日期等属性。然后我将它们添加到对象列表中,以便排序并打印为csv。我现在被要求在UI中添加监视搜索的功能,以取代进度条之类的东西。
我对编写WinForm ui非常陌生,所以我不完全确定从哪里开始。我一直在为创建的每个文件对象更新toolstripstatuslabel,但我不确定应该如何完成。我读过使用BackgroundWorker完成类似任务的建议,但由于这是该程序唯一的任务,因此似乎有点过头了。我认为我需要使用事件处理程序/委托,但不完全确定如何实现它。
我很高兴张贴任何代码,将是有帮助的。谢谢。
我最终能够通过向包含递归搜索的类添加事件处理程序来实现这一点。当我为目录中的每个文件设置文件对象的名称时,设置一个onPropertyChanged事件。我将其绑定到后台工作器DoWork中的表单。然后,当事件被触发时,我报告进度,并使用后台工作进程ProgressChanged将文本设置为当前文件名。下面是我的程序中的一些代码片段,可以帮助那些试图做类似事情的人。
搜索类
foreach (string file in Directory.GetFiles(dir))
{
//creating objects for each file in the directory
FileObject fileObject = new FileObject();
FileInfo info = new FileInfo(file);
currentfile = file.ToString();
fileObject.name = info.Name.ToString();
fileObject.path = file.ToString();
fileObject.createdDate = info.CreationTime.ToString();
FileList.Add(fileObject);
//event handler triggered
OnFileNameChanged(name);
}
//event handler code
public event PropertyChangedEventHandler PropertyChanged;
protected void OnFileNameChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
在windows窗体
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//do some work
search.PropertyChanged += (s, pe) => backgroundWorker1.ReportProgress(unusedNumber);
backgroundWorker1.ReportProgress(100);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//change label
label1.Text = search.currentfile;
}
是的,你可以使用事件作为一个解决方案,如果你不希望UI是"可点击的"。递归代码应该提供一个事件,您的UI可以订阅它。事件处理程序将获取必要的数据并重新绘制表单。但通常这不是一个好方法。你将无法处理你的表单,因为UI线程正忙于任务,你不能以一种用户友好的方式(不杀死它的进程)终止你的任务。