Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从其他类向MainForm列表框添加项_C# - Fatal编程技术网

C#从其他类向MainForm列表框添加项

C#从其他类向MainForm列表框添加项,c#,C#,我对编程还是相当陌生的,并且已经开始了一个项目,我试图将程序的功能划分为几个类,每个类处理与程序特定部分相关的大部分内容 我有一个名为DirectoryMonitors的类,它创建一个对象,该对象使用FileSystemWatcher监视目录。我正在尝试从这个DirectoryMonitors类的实例向MainForm上的列表框添加项。然而,我似乎无法在MainForm中调用该方法,除非它是静态的-但是如果它是静态的,我就无法访问我的列表框 我的DirectoryMonitor类的相关部分: p

我对编程还是相当陌生的,并且已经开始了一个项目,我试图将程序的功能划分为几个类,每个类处理与程序特定部分相关的大部分内容

我有一个名为DirectoryMonitors的类,它创建一个对象,该对象使用FileSystemWatcher监视目录。我正在尝试从这个DirectoryMonitors类的实例向MainForm上的列表框添加项。然而,我似乎无法在MainForm中调用该方法,除非它是静态的-但是如果它是静态的,我就无法访问我的列表框

我的DirectoryMonitor类的相关部分:

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;

}