.NET Listbox:在ItemChecked事件中,知道是否单击了该项

时间:2011-05-05 20:37:54

标签: c# .net winforms events listbox

我在winforms应用程序中有一个ListBox,我需要处理ItemChecked因为每次用户cliks我需要一些东西的项目。问题是我还需要在表单的其他一些事件中更改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 个答案:

答案 0 :(得分:3)

如果我理解正确,我认为您想要在幕后更改Checked属性时取消订阅ItemCheck事件(即用户没有导致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;
}

答案 1 :(得分:2)

一种方法是使用bool变量,比如说ManualRaise。当您通过代码提出事件时,设置ManualRaise = true并在事件内部检查'

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

如果你将举起列表框事件,请将ManualRaise设置为true。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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