1

我在运行时在流面板中创建列表视图,稍后将接受拖放文件。原因是我希望这些充当文件夹,以便用户双击并获得一个显示内容的窗口。

添加列表视图时,我很难为列表视图设置事件。

如何为每个添加的列表视图动态创建一些事件(如 MouseDoubleClick 和 DragDrop)?我可以为这两个事件创建一个函数并让 listview1、listview2、listviewX 使用它吗?

我有一个添加列表视图的按钮,效果很好。请告知,如果这太概念化且不够准确,我深表歉意。

private void addNewWOButton_Click(object sender, EventArgs e)
        {
            ListView newListView = new ListView();
            newListView.AllowDrop = true;
            flowPanel.Controls.Add(newListView);
        }
4

2 回答 2

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;
于 2012-01-27T02:10:17.793 回答
0

-=如果您还动态删除ListViews ,请确保将事件与事件断开连接。

要回答您问题的另一半,您可以对来自任何来源的具有处理程序签名的任何事件使用单个处理程序。在处理程序的主体中,您只需检查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;
        .....
    }  
}     
于 2012-01-27T02:27:19.043 回答