我创建了一个新的类文件:我想将form1中的方法DirSearch移动到这个新的类文件中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Search_Text_In_Files
{
class Search_Engine
{
}
}
在form1中
void DirSearch(string rootDirectory, string filesExtension, string textToSearch, BackgroundWorker worker, DoWorkEventArgs e)
{
List<string> filePathList = new List<string>();
List<string> restrictedFiles = new List<string>();
int overallfiles = 0;
int numberoffiles = 0;
int numberofdirs = 0;
try
{
var dirs = F(textBox3.Text, 0);
var deep = (from d in dirs
orderby d.Item2 descending
select d).FirstOrDefault().Item2;
filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList();
}
catch (Exception err)
{
string ad = err.ToString();
}
foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
List<MyProgress> prog = new List<MyProgress>();
int var = File.ReadAllText(file).Contains(textToSearch) ? 1 : 0;
overallfiles++;
if (var == 1)
{
numberoffiles++;
prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString() });
backgroundWorker1.ReportProgress(0, prog);
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
continue;
}
}
}
我的问题是我需要传递textBoxes或标签我应该怎么做?只需在新类中为方法添加更多textBox和label控件参数吗?
我只想安排我的form1代码。
答案 0 :(得分:0)
如果您正在尝试编写一个不与您的表单(或任何其他类型的UI)耦合的类,您应该传递数据值而不是控件。这将使您的新类可重用。
答案 1 :(得分:0)
你可以做你正在描述的事情,但它不会取得多大成就。 DirSearch
完全取决于表单中的控件。如果你只是将方法移动到另一个类,它仍将依赖于该形式。
此外,这些控制可能是private
,这意味着您的其他课程将无法访问它们。您可以更改他们对internal
的访问权限,但它根本不会为您提供任何帮助。
编写一个处理文件等细节但不直接与控件交互的类会更有意义。该类可以执行搜索并公开属性或引发指示其进度的事件,并在完成时引发事件。您的表单创建该类,告诉它要执行哪些搜索,然后通过更新其控件来响应这些事件。
另一种说法相同的方式:如果你的Search_Engine
课不在表格应用程序中,你会怎么写?如果同一个类也需要在控制台应用程序中工作怎么办?写那样的课。假设类可以通信的唯一方式是它公开的属性和它引发的事件。使用Search_Engine
的类完全负责确定这些事件是否或如何以某种方式传达给UI。