C# 如何在WinForm UI中显示递归搜索访问的文件?
我编写了一个程序,递归地遍历一个目录,通过文件夹浏览器对话框进行选择,并对其中的所有文件和所有子目录进行清点。对于每个文件,我创建一个文件对象,并为其提供名称、路径和创建日期属性。然后,我将它们添加到一个对象列表中,以作为csv进行排序和打印。我现在被要求添加在UI中观看搜索的功能,而不是像进度条这样的东西 我对编写WinForm UI非常陌生,所以我不完全确定从哪里开始。我一直在为创建的每个文件对象更新toolstripstatuslabel,但不确定该如何做。我已经阅读了使用BackgroundWorker执行类似任务的建议,但由于这是该程序执行的唯一任务,因此似乎有点过火。我想我需要使用eventhandler/delegate,但并不完全确定如何实现它C# 如何在WinForm UI中显示递归搜索访问的文件?,c#,visual-studio-2008,user-interface,event-handling,backgroundworker,C#,Visual Studio 2008,User Interface,Event Handling,Backgroundworker,我编写了一个程序,递归地遍历一个目录,通过文件夹浏览器对话框进行选择,并对其中的所有文件和所有子目录进行清点。对于每个文件,我创建一个文件对象,并为其提供名称、路径和创建日期属性。然后,我将它们添加到一个对象列表中,以作为csv进行排序和打印。我现在被要求添加在UI中观看搜索的功能,而不是像进度条这样的东西 我对编写WinForm UI非常陌生,所以我不完全确定从哪里开始。我一直在为创建的每个文件对象更新toolstripstatuslabel,但不确定该如何做。我已经阅读了使用Backgrou
我很高兴发布任何有帮助的代码。谢谢。是的,如果您不希望用户界面“可点击”,您可以使用事件作为解决方案。递归代码应该提供一个事件,用户界面可以订阅它。事件处理程序将获取必要的数据并重新绘制表单。但通常这不是一个好方法。您将无法对表单执行操作,因为UI线程正忙于任务,并且您无法以用户友好的方式中止任务(不终止其进程)。我最终能够通过向包含递归搜索的类添加事件处理程序来实现这一点。当我为目录中的每个文件设置文件对象的名称时,设置onPropertyChanged事件。我把它系在背景工作者的嫁妆上。然后,我在触发事件时报告了进度,并使用后台工作进程更改将文本设置为当前文件名。下面是我的程序中的一些代码片段,可以帮助任何试图做类似事情的人 在搜索课上 在windows窗体中
您想要访问的所有文件的列表,还是仅查看当前正在访问的文件?仅查看当前正在访问的文件。每一个都只会闪现一小会儿,但这将是进步的象征。那么您建议采用什么方法?后台工作人员?是的。这将是最好的开始,并填补你需要建立适当的用户友好的Win应用程序。
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;
}