我在C#软件中使用CheckedListBox。该软件通过图形界面检查和取消检查项目以及用户。我添加了一个按钮以取消选中所有项目。当用户按下按钮时,软件应取消选中所有项目。有时,当我单击按钮后通过软件取消选中项目时,某些项目仍会出现在列表框的选中项目属性中。 CheckedListBox是否需要一些时间来更新CheckedItems属性?还是我的Invoke-Usage有问题?
我发现,当我在取消选中和读取选中项目之间设置一个断点时,选中项目会正确更新。
//---------------------------------------------
// function to get the checked items
//---------------------------------------------
public List<object> getCheckedItems() {
var returnedItems = new List<object>();
var checkedItems = checkedListBox.CheckedItems;
var iterator = checkedItems.GetEnumerator();
while ( iterator.MoveNext() )
returnedItems.Add( iterator.Current );
return returnedItems;
}
//---------------------------------------------
// function to uncheck an item
//---------------------------------------------
public void uncheckItem( object item ) {
if ( containsItem( item ) ) {
int index = checkedListBox.Items.IndexOf( item );
if ( checkedListBox.InvokeRequired ) {
var uncheckInvoker =
new MethodInvoker( () => checkedListBox.SetItemChecked( index, false ) );
checkedListBox.BeginInvoke( uncheckInvoker );
}
else
checkedListBox.SetItemChecked( index, false );
// the following two line are added for debugging
var items = checkedListBox.CheckedItems; // breakpoint here
Console.WriteLine( "number of checked items = " + items.Count );
}
else
throw new ArgumentException( "Item " + item + " is not available" );
}
//---------------------------------------------
//client code
//---------------------------------------------
var checkedItems = subTestListBox.getCheckedItems();
foreach ( var checkedItem in checkedItems )
subTestListBox.uncheckItem( checkedItem );
我希望在调用SetItemChecked( int, bool )
函数之后立即更新checkedItems属性。
答案 0 :(得分:-1)
简化?
private void UncheckAll(CheckedListBox clb)
{
if (clb.InvokeRequired)
{
clb.Invoke((MethodInvoker)delegate {
UncheckAll(clb);
});
}
else
{
for(int i = 0; i < clb.Items.Count; i++)
{
if (clb.GetItemChecked(i))
{
clb.SetItemChecked(i, false);
}
}
}
}