.NET Listbox: в событии ItemChecked знать, был ли нажат элемент - PullRequest
1 голос
/ 06 мая 2011

У меня есть ListBox в моем приложении winforms, и мне нужно обрабатывать ItemChecked, потому что каждый раз, когда пользователь нажимает на элемент, который мне нужен, для какого-то материала. Проблема в том, что мне также нужно изменить свойство Checked в некоторых других событиях формы. В этих случаях мне нужно избегать таких вещей.

Пример:

private void listBox1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
  if (true) //Should check if item was clicked.
  {
     //Do some stuff
  }
  else //If the event was fired because I changed the Checked property from the code
  {
     //Do some other stuff
  }
}

Спасибо

Ответы [ 4 ]

3 голосов
/ 06 мая 2011

Если я вас правильно понимаю, я думаю, что вы хотите отменить подписку на событие ItemCheck при изменении свойства Checked за кулисами (т. Е. Пользователь не вызвал изменение свойства Checked).

Так что дляпример:

public void SetupListBoxEnables()
{  
   // Do not listen for Checked change events
   listBox1.ItemCheck -= listBox1_ItemChecked;
   // Change a bunch of Checked properties
   // ....

   // Listen again for Checked change events
   listBox1.ItemCheck += listBox1_ItemChecked;
}
2 голосов
/ 06 мая 2011

Один из способов - использовать переменную bool, скажем, ManualRaise. Когда вы вызываете событие с помощью кода, установите ManualRaise = true, и внутри вашего события вы можете проверить '

if(ManualRaise) 
{
// this was manual event raise
ManualRaise = False
} 
else 
{
}

и в том случае, когда вы вызовете событие списка, установите для ManualRaise значение true.

0 голосов
/ 06 мая 2011

Все ответы, которые вы получили до сих пор, великолепны. Мне, однако, интересно, может ли более разумно поместить логику, специфичную для программной установки выбранного элемента списка, в тот же код, который фактически устанавливает свойство selected, а не полагаться на событие ItemChecked. Событие может вызывать тот же код, что и предыдущий код.

пример:

public void SomeFunction()
{
  // set checkbox
  listBox1.Items[index].Checked = true;

  // Handle the change in state
  HandleState();
}

protected void listBox1_ItemChecked(object sender, ItemCheckedEventArgs e) 
{
  HandleState();
}

   private function HandleState()
   {
      // Handle your visual state here
   }
0 голосов
/ 06 мая 2011

Я сохраняю логическое значение в классе, чтобы отслеживать, когда действия выполняются пользователем или автоматически системой. Всякий раз, когда я собираюсь изменить, например, CheckBox.Checked, я устанавливаю значение Boolean равным True, затем после завершения возвращаюсь к False.

В обработчике событий Checked я проверяю, произошло ли событие, в то время как логическое значение true, чтобы определить, какой код выполнять.

private Boolean blnSystem = false;

private void SystemChanges()
{
    try
    {
        blnSystem = true;

        //Code which changes listBox1 Item Checked values
    }
    catch
    {
        //Error handler
    }
    finally
    {
        blnSystem = false;
    }
}

private void listBox1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
    if (!blnSystem) //Should check if item was clicked.
    {
        //Do some stuff
    }
    else //If the event was fired because I changed the Checked property from the code
    {
        //Do some other stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...