0

我编写了一个程序,它递归地遍历一个目录,通过文件夹浏览器对话框选择,并列出其中的所有文件和所有子目录。对于每个文件,我创建一个文件对象并为其提供名称、路径和创建日期的属性。然后我将它们添加到对象列表中,以便排序并打印为 csv。我现在被要求添加在 UI 中观看搜索的功能,以代替进度条之类的东西。

我对编写 WinForm UI 很陌生,所以我不完全确定从哪里开始。我一直在为创建的每个文件对象更新工具条状态标签,但不确定应该如何完成。我已经阅读了将 BackgroundWorker 用于类似任务的建议,但由于这是该程序执行的唯一任务,这似乎有点矫枉过正。我想我需要使用事件处理程序/委托,但不完全确定如何实现它。

我很高兴发布任何有用的代码。谢谢。

4

2 回答 2

1

我终于能够通过向包含递归搜索的类添加一个事件处理程序来实现这一点。当我为目录中的每个文件设置文件对象的名称时,设置一个 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;
    }
于 2013-03-12T13:09:02.890 回答
0

是的,如果您不希望 UI 是“可点击的”,您可以使用事件作为解决方案。递归代码应该提供一个事件并且你的 UI 可以订阅它。事件处理程序将获取必要的数据并重绘表单。但通常这不是一个好方法。您将无法对表单进行操作,因为 UI 线程正忙于任务,并且您无法以用户友好的方式中止任务(不杀死它的进程)。

于 2013-03-07T17:17:59.840 回答