2012-01-27 3 views
1

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

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

Как я могу создать некоторые события (например, MouseDoubleClick и DragDrop) динамически для каждого добавленного списка? могу ли я создать одну функцию для обоих этих событий и иметь listview1, listview2, listviewX использовать ее?

У меня есть кнопка, которая добавляет listviews, которая отлично работает. пожалуйста, сообщите, я извиняюсь, если это слишком концептуально и недостаточно точно.

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

ответ

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

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

newListView.DragEnter += (s, de) => de.Effect = DragDropEffects.Copy; 
+0

получил его. до сих пор не использовал аргумент отправителя. Теперь у меня есть. Благодарю. 'code'ListView thisListView = отправитель как ListView; thisListView.Items.Add (файл); – ikathegreat

0

Просто убедитесь, что unwire события с -= если вы удалите ListView s динамически.

Чтобы ответить на другую половину вопроса, вы можете использовать один обработчик для любого события из любого источника, имеющего подпись обработчика. В теле обработчика вам просто нужно проверить аргумент 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; 
     ..... 
    } 
}  
+0

славное спасибо. хорошая вещь о том, что я делаю, я не позволю пользователю удалять динамически (пока). им придется ждать версии 2.0. – ikathegreat

Смежные вопросы