带有listview的流程面板

时间:2012-01-27 01:55:16

标签: c# listview runtime flowpanel

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

我在添加列表视图时难以设置事件。

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

我有一个添加列表视图的按钮,工作正常。请指教,如果这太概念化而且不够准确,我道歉。

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

2 个答案:

答案 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;
        .....
    }  
}