Использование данных EventArgs - PullRequest
0 голосов
/ 21 июня 2020

У меня есть три класса, FileManagerClass содержит два события: EventHandler<FileTransferEventArgs> FileMove и EventHandler<FileTransferEventArgs> FileMoveError.

Затем у меня есть собственный EventArgs класс с именем FileTransferEventArg, который наследуется от базового EventArgs класс. У меня есть третий класс, называемый FolderDirectoryModel, который затем прослушивает события, которые будут вызваны, и отвечает на них либо OnFileMove(object sender, FileTransferEventArg arg), либо OnFileMoveError(object sender, FileTransferEventArg arg).

В целом это выглядит так:

class FileTransferManager
{
    public event EventHandler<FileTransferEventArgs> FileMove;
    public event EventHandler<FileTransferEventArgs> FileMoveError;
}

public class FileTransferEventArgs : EventArgs
{
    string FileName { get; set; }
    string Message { get; set; }

    internal FileTransferEventArgs(FileModel file, string message)
    {
        this.FileName = file.FileName;
        this.Message = message;
    }
}

public class FolderDirectoryModel
{
    void TransferFile(FileModel toBeTransfered, string destinationPath)
    {
        if (!File.Exists(toBeTransfered.FilePath))
        {
            File.Move(toBeTransfered.FilePath, destinationPath);
            FileTransferEvents.FileTransferManager TransferAgent = new FileTransferEvents.FileTransferManager();
            TransferAgent.FileMove += new EventHandler<FileTransferEventArgs>(OnFileMove);                
        }
        else
        {
            FileTransferEvents.FileTransferManager TransferAgent = new FileTransferEvents.FileTransferManager();
            TransferAgent.FileMoveError += new EventHandler<FileTransferEventArgs>(OnFileMoveError);
        }
    }

    //Handler Methods
    private void OnFileMoveError(object sender, FileTransferEventArgs args)
    {
        //what i want to happen

        MessageBox.Show($"File {args.FileName} has not been moved succefully to {args.FilePath} because of....");
    }

    private void OnFileMove(object sender, FileTransferEventArgs args)
    {
        //what i want to happen
        MessageBox.Show($"File {args.FileName} has been moved successfully to {args.FilePath}
    }
}

Моя проблема в том, что я хотел бы использовать свойства внутри моего FileTransferEventArgs класса для отображения имени файла, который был перемещен, независимо от того, было ли оно успешным, и с указанием причины, которая будет внутри свойства сообщения.

Однако, когда я все подключил, я не смог просмотреть передаваемые данные. Я не уверен, что использую события неправильно или пытаюсь сделать что-то, что невозможно.

1 Ответ

0 голосов
/ 26 июня 2020

События FileMove и FileMoveError должны быть помещены в класс FolderDirectoryModel.

События запускаются в том же классе. Используя метод Invoke.

public class FileTransferEventArgs : EventArgs
{
    public string FileName { get; }
    public string FilePath { get; }
    public string Message { get; }

    internal FileTransferEventArgs(FileModel file, string message)
    {
        FileName = file.FileName;
        FilePath = file.FilePath;
        Message = message;
    }
}

public class FileModel
{
    public string FileName { get; set; }
    public string FilePath { get; set; }
}

public class FolderDirectoryModel
{
    public event EventHandler<FileTransferEventArgs> FileMove;
    public event EventHandler<FileTransferEventArgs> FileMoveError;

    public void TransferFile(FileModel fileModel, string destinationPath)
    {
        if (!File.Exists(fileModel.FilePath))
        {
            File.Move(fileModel.FilePath, destinationPath);
            var fileTransferEventArgs = new FileTransferEventArgs(fileModel, "Success");
            FileMove?.Invoke(this, fileTransferEventArgs);
        }
        else
        {
            var fileTransferEventArgs = new FileTransferEventArgs(fileModel, "Cannot move");
            FileMoveError?.Invoke(this, fileTransferEventArgs);
        }
    }
}

Использование

var fileModel = new FileModel { FileName = "name", FilePath = "path" };

var folderDirectoryModel = new FolderDirectoryModel();
folderDirectoryModel.FileMove += FolderDirectoryModel_FileMove;
folderDirectoryModel.FileMoveError += FolderDirectoryModel_FileMoveError;

folderDirectoryModel.TransferFile(fileModel, "destPath");
void FolderDirectoryModel_FileMove(object sender, FileTransferEventArgs args)
{
    MessageBox.Show($"File {args.FileName} has been moved successfully to {args.FilePath}");
}

void FolderDirectoryModel_FileMoveError(object sender, FileTransferEventArgs args)
{
    MessageBox.Show($"File {args.FileName} has not been moved to {args.FilePath} because of {args.Message}");
}

Обработчики событий расположены в том же коде, в котором создается и используется экземпляр FolderDirectoryModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...