我在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
}
}
由于
答案 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
}