将参数传递给事件处理程序

use*_*592 16 c# winforms

我想List<string>使用我的事件传递我的参数

public event EventHandler _newFileEventHandler;
    List<string> _filesList = new List<string>();

public void startListener(string directoryPath)
{
    FileSystemWatcher watcher = new FileSystemWatcher(directoryPath);
    _filesList = new List<string>();
    _timer = new System.Timers.Timer(5000);
    watcher.Filter = "*.pcap";
    watcher.Created += watcher_Created;            
    watcher.EnableRaisingEvents = true;
    watcher.IncludeSubdirectories = true;
}

void watcher_Created(object sender, FileSystemEventArgs e)
{            
    _timer.Elapsed += new ElapsedEventHandler(myEvent);
    _timer.Enabled = true;
    _filesList.Add(e.FullPath);
    _fileToAdd = e.FullPath;
}

private void myEvent(object sender, ElapsedEventArgs e)
{
    _newFileEventHandler(_filesList, EventArgs.Empty);;
}
Run Code Online (Sandbox Code Playgroud)

从我的主要表格,我想得到这个列表:

void listener_newFileEventHandler(object sender, EventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

Saw*_*wan 58

创建一个新的EventArgs类,例如:

    public class ListEventArgs : EventArgs
    {
        public List<string> Data { get; set; }
        public ListEventArgs(List<string> data)
        {
            Data = data;
        }
    }
Run Code Online (Sandbox Code Playgroud)

并使您的活动如下:

    public event EventHandler<ListEventArgs> NewFileAdded;
Run Code Online (Sandbox Code Playgroud)

添加点火方法:

protected void OnNewFileAdded(List<string> data)
{
    var localCopy = NewFileAdded;
    if (localCopy != null)
    {
        localCopy(this, new ListEventArgs(data));
    }
}
Run Code Online (Sandbox Code Playgroud)

当你想要处理这个事件时:

myObj.NewFileAdded += new EventHandler<ListEventArgs>(myObj_NewFileAdded);
Run Code Online (Sandbox Code Playgroud)

处理程序方法如下所示:

public void myObj_NewFileAdded(object sender, ListEventArgs e)
{
       // Do what you want with e.Data (It is a List of string)
}
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注,请考虑从 EventArgs(或 EventArgs 层次结构中的其他合适的类)继承 (2认同)

Ser*_*rvy 6

您可以将事件的签名定义为您想要的任何内容。如果事件需要提供的唯一信息是该列表,则只需传递该列表:

public event Action<List<string>> MyEvent;

private void Foo()
{
     MyEvent(new List<string>(){"a", "b", "c"});
}
Run Code Online (Sandbox Code Playgroud)

然后在订阅事件时:

public void MyEventHandler(List<string> list)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)