2012-05-26 3 views
3

Эй, ребята, им жесткое время, пытаясь решить эту проблему ив в течение 3 часов и до сих пор не удалось выяснить, почему его делать это ... вот кодПочему мой обработчик событий срабатывает дважды?

private void Catagory_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     int selectedCategoryId = categoryIdList[categoryListBox.SelectedIndex]; 

     client.GetItemsAsync(selectedCategoryId); 
     client.GetItemsCompleted += 
      new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted); 
    } 

void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e) 
{ 
     itemIdList.Clear(); 
     itemNameList.Clear(); 
     itemNumberList.Clear(); 
     itemDisplayList.Clear(); //Clears the Display List Items 

     if (e.Error == null) 
     { 
      itemIdList = e.ItemIDList; 
      itemNumberList = e.itemNumber; 
      itemNameList = e.Result; 

      for (int i = 0; i < itemIdList.Count; i++) 
      { 
       itemDisplayList.Add(new ItemDisplay { itemNumber = itemNumberList[i], itemName = itemNameList[i] }); 
      } 

      //Populating the listbox controll with the itemDisplaylist... 
      Items.ItemsSource = itemDisplayList; 
     } 
     else 
     { 
      MessageBox.Show("Problem in getting the items list."); 
     } 
    } 

Когда я изменить категорию в первый раз, когда он отлично работает ... я отлично понимаю, что он вызывает функцию GetItemsAsync(selectedCategoryId) и захватывает результаты и вызывает обработчик событий client_GetItemsCompleted(), а внутренняя работа обработчика событий работает так, как предполагается, он устанавливает списки с помощью правильные данные и отображает itemNumber и itemName в списке ... НО, когда я снова меняю категорию, чтобы получить разные элементы, она не работает должным образом, то, что она делает, заключается в том, что она очищает списки и заполняет списки, поскольку это предполагаемый to, запускает цикл for и заполняет listBox с именем Items, но по какой-то причине он снова возвращается в начало функции и опустошает все списки:/... пожалуйста, сообщите мне, почему он снова выполняет функцию .. и когда я выбираю другая категория снова выполняет обработчик событий 3 раза, а затем 4 раза и т. д. Кто-нибудь знает, почему он это делает? мне нужно это фиксированный для моего проекта :(

ответ

11

Everytime это выполняется:

client.GetItemsCompleted += 

Вы добавить абонента к событию, так что второй раз он будет в два раза огонь (в третий раз тройные раз и т.д. .)

либо unsubscrice (- =) в завершенном метода:..

void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e) 
{ 
    try { 
     /* .... */ 
    } 
    finally { 
     client.GetItemsCompleted -= 
      new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted); 
    } 
} 

или инициировать объект клиента перед каждым вызовом

var client = new ...(); 
client.GetItemsAsync(selectedCategoryId); 
client.GetItemsCompleted += 
      new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted); 
+0

как я исправить это ?? – Haseeb

+0

им жаль, но где бы я отказаться от подписки? где я должен писать код 'client.GetItemsCompleted - =' и как бы я его напишу, вы можете сказать, я этого не делал до – Haseeb

+0

Большое вам спасибо: D – Haseeb