панель управления с списком - PullRequest
1 голос
/ 27 января 2012

Я создаю списки в поточной панели во время выполнения, которые позже будут принимать файлы перетаскивания. причина в том, что я хочу, чтобы они действовали как папки, чтобы пользователь дважды щелкал и получал окно с содержимым.

У меня возникают трудности при настройке событий для моих списков просмотра по мере их добавления.

как мне динамически создавать некоторые события (например, 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 ]

1 голос
/ 27 января 2012

В вашем коде уже должна быть подпрограмма:

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 запускает событие.

Вы также можете просто использовать лямбда-функцию для простых вещей:

newListView.DragEnter += (s, de) => de.Effect = DragDropEffects.Copy;
0 голосов
/ 27 января 2012

Просто убедитесь, что события не связаны с -=, если вы также удаляете 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;
        .....
    }  
}     
...