代码之家  ›  专栏  ›  技术社区  ›  Tyrel Denison

如何在WinForm UI中显示递归搜索访问的文件?

  •  0
  • Tyrel Denison  · 技术社区  · 11 年前

    我写了一个程序,可以递归地遍历一个目录,通过文件夹浏览器对话框进行选择,并对其中的所有文件和所有子目录进行清点。对于每个文件,我创建一个文件对象,并赋予它名称、路径和创建日期的属性。然后我将它们添加到一个对象列表中进行排序并打印为csv。我现在被要求添加在UI中观看搜索的功能,而不是像进度条这样的功能。

    我对编写WinForm UI非常陌生,所以我不完全确定从哪里开始。我一直在为创建的每个文件对象更新toolstripstatuslabel,但不确定应该如何做。我读过关于使用BackgroundWorker执行类似任务的建议,但由于这是该程序所做的唯一任务,这似乎有点过头了。我认为我需要使用事件处理程序/委托,但不完全确定如何实现它。

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

    2 回复  |  直到 11 年前
        1
  •  1
  •   Tyrel Denison    11 年前

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

    在窗口窗体中

    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;
        }
    
        2
  •  0
  •   lavrik    11 年前

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