我在运行时在流程界面中创建列表视图,稍后将接受拖放文件。原因是我希望这些作为文件夹,以便用户双击并获得一个显示内容的窗口。
我在添加列表视图时难以设置事件。
如何为每个添加的列表视图动态创建一些事件(如MouseDoubleClick和DragDrop)?我可以为这两个事件创建单个函数,并使用listview1,listview2,listviewX使用它吗?
我有一个添加列表视图的按钮,工作正常。请指教,如果这太概念化而且不够准确,我道歉。
private void addNewWOButton_Click(object sender, EventArgs e)
{
ListView newListView = new ListView();
newListView.AllowDrop = true;
flowPanel.Controls.Add(newListView);
}
答案 0 :(得分:1)
您必须在代码中创建例程:
private void listView_DragDrop(object sender, DragEventArgs e) {
// do stuff
}
private void listView_DragEnter(object sender, DragEventArgs e) {
// do stuff
}
然后在您的日常工作中,将其连接起来:
private void addNewWOButton_Click(object sender, EventArgs e)
{
ListView newListView = new ListView();
newListView.AllowDrop = true;
newListView.DragDrop += listView_DragDrop;
newListView.DragEnter += listView_DragEnter;
flowPanel.Controls.Add(newListView);
}
如果您需要知道哪个ListView控件正在触发事件,您必须检查“发件人”是谁。
你也可以使用lambda函数来处理简单的事情:
newListView.DragEnter += (s, de) => de.Effect = DragDropEffects.Copy;
答案 1 :(得分:0)
如果您还动态移除-=
,请务必使用ListView
取消关联事件。
要回答问题的另一半,您可以对任何来自具有处理程序签名的任何事件使用单个处理程序。在处理程序的主体中,您只需检查sender
参数以确定引发事件的控件。
但是,您需要一种方法来告诉同一个类中不同的控件。一种方法是确保在创建每个控件时设置Name
属性; 例如,newListView.Name = "FilesListView"
。
然后,在事件处理程序中执行任何其他操作之前,请检查发件人。
private void listView_DragDrop(object sender, DragEventArgs e) {
ListView sendingListView = sender as ListView;
if(sendingListView == null) {
// Sender wasn't a ListView. (But bear in mind it could be any class of
// control that you've wired to this handler, so check those classes if
// need be.)
return;
}
switch(sendingListView.Name) {
case "FilesListView":
// do stuff for a dropped file
break;
case "TextListView":
// do stuff for dropped text
break;
.....
}
}