Reputation: 153
I have three classes, the FileManagerClass
contains two events which are EventHandler<FileTransferEventArgs> FileMove
and EventHandler<FileTransferEventArgs> FileMoveError
.
I then have a custom EventArgs
class named FileTransferEventArg
that inherits from the base EventArgs
class. I have a third class called FolderDirectoryModel
that then listens for the events to be raised and responds to it with either a OnFileMove(object sender, FileTransferEventArg arg)
or OnFileMoveError(object sender, FileTransferEventArg arg)
.
Overall, it looks like this:
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}
}
}
My problem is that I would like to use the properties inside my FileTransferEventArgs
class to display the file name that was moved, whether or not it was successful, and providing a reason that will be inside the message property.
However when I get every thing wired up I not able to view the data that is passed along. I am not sure if I am improperly using the events or I am trying to do something that is not possible.
Upvotes: 0
Views: 216
Reputation: 14231
The FileMove
and FileMoveError
events must be placed in the FolderDirectoryModel
class.
Events are triggered in the same class. Using the Invoke
method.
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);
}
}
}
Usage
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}");
}
Event handlers are located in the same code where the FolderDirectoryModel
instance is created and used.
Upvotes: 0