. net列表框:在ItemChecked事件中知道项目是否被点击

本文关键字:项目 是否 列表 事件 ItemChecked net | 更新日期: 2023-09-27 17:54:54

我有一个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
  }
}

谢谢

. net列表框:在ItemChecked事件中知道项目是否被点击

如果我理解正确,我认为你想取消订阅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;
}

一种方法是使用bool变量,例如ManualRaise。当你通过代码引发事件时,设置ManualRaise = true,在你的事件中你可以检查'

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

和在触发列表框事件的事件中,将ManualRaise设置为true

我在类中保留了一个布尔值,以跟踪何时由用户或系统自动执行操作。每当我要改变,例如,复选框。检查后,我将布尔值设置为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
    }
}

到目前为止你得到的所有答案都很棒。但是,我想知道,将特定于编程设置所选列表项的逻辑放在实际设置已检查属性的相同代码中,而不是依赖于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
   }