Manage CheckedListBox ItemCheck 事件在检查项目之后运行而不是之前

Manage CheckedListBox ItemCheck event to run after an item checked not before

我在 C# 窗口窗体应用程序中使用 CheckedListBox

我想在选中或未选中一个项目之后做某事,但 ItemCheck 事件在项目选中/未选中之前运行。

我该怎么做?


CheckedListBox.ItemCheck Event

The check state is not updated until after the ItemCheck event occurs.

要在检查项目后运行一些代码,您应该使用解决方法。

最佳选择

您可以使用此选项(感谢 Hans Passant 的这篇文章):

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  this.BeginInvoke(new Action(() =>

  {

    //Do the after check tasks here

  }));

}

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();

if (e.NewValue == CheckState.Checked)

  checkedIndices.Add(e.Index);

else

  if(checkedIndices.Contains(e.Index))

    checkedIndices.Remove(e.Index);



//now you can do what you need to checkedIndices

//Here if after check but you should use the local variable checkedIndices 

//to find checked indices

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var control = (CheckedListBox)sender;

  // Remove handler

  control.ItemCheck -= checkedListBox_ItemCheck;



  control.SetItemCheckState(e.Index, e.NewValue);



  // Add handler again

  control.ItemCheck += checkedListBox_ItemCheck;



  //Here is After Check, do additional stuff here   

}
  private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)

{

  CheckedListBox clb = (CheckedListBox)sender;

  // Switch off event handler

  clb.ItemCheck -= clbOrg_ItemCheck;

  clb.SetItemCheckState(e.Index, e.NewValue);

  // Switch on event handler

  clb.ItemCheck += clbOrg_ItemCheck;



  // Now you can go further

  CallExternalRoutine();    

}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var checkBoxName = checkedListBox1.Items[e.Index];

  Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);

}

另一种选择

  • 如果在ItemCheck事件的中间,你需要知道item的状态,你应该使用e.NewValue而不是使用checkedListBox1.GetItemChecked(i)

  • 如果您需要将检查索引列表传递给方法,请执行以下操作:

使用代码:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  this.BeginInvoke(new Action(() =>

  {

    //Do the after check tasks here

  }));

}

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();

if (e.NewValue == CheckState.Checked)

  checkedIndices.Add(e.Index);

else

  if(checkedIndices.Contains(e.Index))

    checkedIndices.Remove(e.Index);



//now you can do what you need to checkedIndices

//Here if after check but you should use the local variable checkedIndices 

//to find checked indices

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var control = (CheckedListBox)sender;

  // Remove handler

  control.ItemCheck -= checkedListBox_ItemCheck;



  control.SetItemCheckState(e.Index, e.NewValue);



  // Add handler again

  control.ItemCheck += checkedListBox_ItemCheck;



  //Here is After Check, do additional stuff here   

}
  private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)

{

  CheckedListBox clb = (CheckedListBox)sender;

  // Switch off event handler

  clb.ItemCheck -= clbOrg_ItemCheck;

  clb.SetItemCheckState(e.Index, e.NewValue);

  // Switch on event handler

  clb.ItemCheck += clbOrg_ItemCheck;



  // Now you can go further

  CallExternalRoutine();    

}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var checkBoxName = checkedListBox1.Items[e.Index];

  Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);

}

另一个选项

在ItemCheck事件的中间,移除ItemCheck的handler,SetItemCheckState,然后添加handler egain。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  this.BeginInvoke(new Action(() =>

  {

    //Do the after check tasks here

  }));

}

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();

if (e.NewValue == CheckState.Checked)

  checkedIndices.Add(e.Index);

else

  if(checkedIndices.Contains(e.Index))

    checkedIndices.Remove(e.Index);



//now you can do what you need to checkedIndices

//Here if after check but you should use the local variable checkedIndices 

//to find checked indices

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var control = (CheckedListBox)sender;

  // Remove handler

  control.ItemCheck -= checkedListBox_ItemCheck;



  control.SetItemCheckState(e.Index, e.NewValue);



  // Add handler again

  control.ItemCheck += checkedListBox_ItemCheck;



  //Here is After Check, do additional stuff here   

}
  private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)

{

  CheckedListBox clb = (CheckedListBox)sender;

  // Switch off event handler

  clb.ItemCheck -= clbOrg_ItemCheck;

  clb.SetItemCheckState(e.Index, e.NewValue);

  // Switch on event handler

  clb.ItemCheck += clbOrg_ItemCheck;



  // Now you can go further

  CallExternalRoutine();    

}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var checkBoxName = checkedListBox1.Items[e.Index];

  Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);

}

尝试更多地寻找答案,因为这里是

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  this.BeginInvoke(new Action(() =>

  {

    //Do the after check tasks here

  }));

}

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();

if (e.NewValue == CheckState.Checked)

  checkedIndices.Add(e.Index);

else

  if(checkedIndices.Contains(e.Index))

    checkedIndices.Remove(e.Index);



//now you can do what you need to checkedIndices

//Here if after check but you should use the local variable checkedIndices 

//to find checked indices

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var control = (CheckedListBox)sender;

  // Remove handler

  control.ItemCheck -= checkedListBox_ItemCheck;



  control.SetItemCheckState(e.Index, e.NewValue);



  // Add handler again

  control.ItemCheck += checkedListBox_ItemCheck;



  //Here is After Check, do additional stuff here   

}
  private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)

{

  CheckedListBox clb = (CheckedListBox)sender;

  // Switch off event handler

  clb.ItemCheck -= clbOrg_ItemCheck;

  clb.SetItemCheckState(e.Index, e.NewValue);

  // Switch on event handler

  clb.ItemCheck += clbOrg_ItemCheck;



  // Now you can go further

  CallExternalRoutine();    

}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var checkBoxName = checkedListBox1.Items[e.Index];

  Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);

}

还有链接:

检查项目后会触发哪个 CheckedListBox 事件?


您可以在 ItemCheck 上连接一个事件。您可以通过右键单击复选框列表并选择属性来完成。在右侧您将看到属性选项卡,单击事件选项卡按钮并找到 ItemCheck 事件并双击它。它将根据您的复选框列表名称为您生成一个事件方法,如下所示。

然后,您可以使用下面的代码验证选中/选中的复选框。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  this.BeginInvoke(new Action(() =>

  {

    //Do the after check tasks here

  }));

}

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();

if (e.NewValue == CheckState.Checked)

  checkedIndices.Add(e.Index);

else

  if(checkedIndices.Contains(e.Index))

    checkedIndices.Remove(e.Index);



//now you can do what you need to checkedIndices

//Here if after check but you should use the local variable checkedIndices 

//to find checked indices

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var control = (CheckedListBox)sender;

  // Remove handler

  control.ItemCheck -= checkedListBox_ItemCheck;



  control.SetItemCheckState(e.Index, e.NewValue);



  // Add handler again

  control.ItemCheck += checkedListBox_ItemCheck;



  //Here is After Check, do additional stuff here   

}
  private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)

{

  CheckedListBox clb = (CheckedListBox)sender;

  // Switch off event handler

  clb.ItemCheck -= clbOrg_ItemCheck;

  clb.SetItemCheckState(e.Index, e.NewValue);

  // Switch on event handler

  clb.ItemCheck += clbOrg_ItemCheck;



  // Now you can go further

  CallExternalRoutine();    

}

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

  var checkBoxName = checkedListBox1.Items[e.Index];

  Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);

}

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161