C#从其他类向MainForm列表框添加项
我对编程还是相当陌生的,并且已经开始了一个项目,我试图将程序的功能划分为几个类,每个类处理与程序特定部分相关的大部分内容 我有一个名为DirectoryMonitors的类,它创建一个对象,该对象使用FileSystemWatcher监视目录。我正在尝试从这个DirectoryMonitors类的实例向MainForm上的列表框添加项。然而,我似乎无法在MainForm中调用该方法,除非它是静态的-但是如果它是静态的,我就无法访问我的列表框 我的DirectoryMonitor类的相关部分:C#从其他类向MainForm列表框添加项,c#,C#,我对编程还是相当陌生的,并且已经开始了一个项目,我试图将程序的功能划分为几个类,每个类处理与程序特定部分相关的大部分内容 我有一个名为DirectoryMonitors的类,它创建一个对象,该对象使用FileSystemWatcher监视目录。我正在尝试从这个DirectoryMonitors类的实例向MainForm上的列表框添加项。然而,我似乎无法在MainForm中调用该方法,除非它是静态的-但是如果它是静态的,我就无法访问我的列表框 我的DirectoryMonitor类的相关部分: p
public class DirectoryMonitorData
{
public bool WatcherActive { get; set; } = true;
public string EQVersion { get; set; }
public string FolderLocation { get; set; }
}
public class DirectoryMonitor : DirectoryMonitorData
{
private void FolderWatcher_Changed(object sender, FileSystemEventArgs e)
{
FileInfo fi = new FileInfo(e.FullPath);
if (!IsFileLocked(fi))
{
int startPos = e.FullPath.LastIndexOf("\\") + 1;
int endPos = e.FullPath.IndexOf("-Inventory") - startPos;
string character = e.FullPath.Substring(startPos, endPos);
MessageBox.Show(character);
string[] delimiters = { ControlChars.Tab.ToString() };
using (TextFieldParser parser = Microsoft.VisualBasic.FileIO.FileSystem.OpenTextFieldParser(e.FullPath, delimiters))
{
// Process the file's lines.
while (!parser.EndOfData)
{
try
{
string[] fields = parser.ReadFields();
MainForm.addLogToListBox(fields[0]);
for (int i = 1; i <= 5; i++)
{
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
private bool IsFileLocked(FileInfo file)
{
...
}
}
更新代码:
public FileSystemWatcher FolderWatcher = new FileSystemWatcher();
public DirectoryMonitor()
{
FolderWatcher.NotifyFilter = NotifyFilters.LastWrite;
FolderWatcher.Filter = "*-Inventory.txt";
FolderWatcher.Changed += FolderWatcher_Changed;
}
public void setupDirectoryMonitorList()
{
foreach (DirectoryMonitorData dmd in MainForm.directoryMonitorList)
{
DirectoryMonitor dm = new DirectoryMonitor()
{
WatcherActive = dmd.WatcherActive,
FolderLocation = dmd.FolderLocation,
EQVersion = dmd.EQVersion
};
if (dm.WatcherActive)
{
dm.FolderWatcher.Path = dm.FolderLocation;
dm.FolderWatcher.EnableRaisingEvents = true;
dm.FolderWatcher.NotifyFilter = NotifyFilters.LastWrite;
dm.FolderWatcher.Filter = "*-Inventory.txt";
dm.FolderWatcher.Changed += FolderWatcher_Changed;
}
MainForm.directoryMonitorObjects.Add(dm);
}
}
将属性添加到
DirectoryMonitorData
类并将列表框传递给它:
public class DirectoryMonitorData
{
public bool WatcherActive { get; set; } = true;
public string EQVersion { get; set; }
public string FolderLocation { get; set; }
public ListBox Logs {get; set;}
}
然后:
DirectoryMonitor monitor = new DirectoryMonitor { Logs = logsListBox };
现在,在您的类中,您可以简单地向该列表框添加任何内容:
Logs.Items.Add(Something);
我通常这样做的方式是向类添加一个
构造函数,它接受一个'MainForm'
参数,然后将'MainForm'
参数保存在一个字段中
public class DirectoryMonitor : DirectoryMonitorData
{
public DirectoryMonitor(MainForm form)
{
this.mainForm = form;
}
private MainForm mainForm;
}
现在,您可以使用MainForm
字段访问MainForm
的所有public
方法和属性
备选方案:
在类中创建一个eventhandler
(使用自定义EventArgs
)。然后从“主窗体”订阅该活动。现在,全班同学不必知道关于表单的任何信息。您只需要调用类中的事件处理程序。我更新了帖子以显示更多代码。我认为您的解决方案需要在MainForm类中创建对象?这不是我想要做的。我确实尝试将创建转移到MainForm类,这带来了一系列新问题,但仍然没有成功(我在线程方面也遇到了一个错误)。好吧,不管怎样,你必须告诉你的类,“MainForm”是什么,传递对它的引用。现在当我尝试使用你的方法访问它时,VS不会抛出任何错误,但是当我运行它时,它试图访问列表框,我得到了以下错误:System.InvalidOperationException:“跨线程操作无效:从创建它的线程以外的线程访问控件'logsListBox'。如果您是从后台线程调用,则需要使用'Invoke'返回UI线程。非常感谢,查找调用是什么/如何使用它让我找到了一个有效的解决方案!这就是为什么我要做这些项目,学习新的东西!
public class DirectoryMonitor : DirectoryMonitorData
{
public DirectoryMonitor(MainForm form)
{
this.mainForm = form;
}
private MainForm mainForm;
}