我想通过从ListView中选择一个复选框来自动从ListView中选择所有复选框来编写代码。
我使用的是Visual Studio 2005,因此没有ItemChecked表单。 那就是为什么我想通过使用ListView itemcheck事件来做到这一点。这是我的代码。
private void lvBase_ItemCheck_1(object sender, ItemCheckEventArgs e)
{
if ( ) // If selecting one checkbox from the ListView
{
for (int i = 0; i < lvBase.Items.Count; i++)
{
// Select all checkbox from the ListView
}
}
else // If unselecting one checkbox from the ListView
{
for (int i = 0; i < lvBase.Items.Count; i++)
{
// Unselect all checkbox from the ListView
}
}
}
您能帮我填写一下吗?或者,如果您有更好的主意,请分享:)
答案 0 :(得分:1)
?
答案 1 :(得分:1)
注意:最可能有一种更好的方法来执行此操作,但这是我很久以前使用的一种模式,后来才起作用。 :)
在上面显示的情况下,将从列表视图中调用它,并且ItemCheckEventArgs e
将告诉您是否选中了该框。它实际上告诉您在检查之前 复选框的状态。因此,如果未选中复选框,而用户只是选中了它,则e.CurrentValue
将是CheckState.Unchecked
。
现在,如果我们尝试更新ItemCheck
事件中所有复选框的状态,可能会遇到的问题是,每当我们选中一个复选框时,都会递归调用该事件。解决此问题的一种方法是跟踪用户是否正在调用事件(通过选中一个框),或者我们是否通过调用item.Checked = true;
来触发事件。
类似这样的方法可能会解决问题:
// Set this to true when our code is modifying the checked state of a listbox item
private bool changingCheckboxState = false;
private void lvBase_ItemCheck(object sender, ItemCheckEventArgs e)
{
// If our code triggered this event, just return right away
if (changingCheckboxState) return;
// Set our flag so that calls to this method inside the
// loop below don't trigger more calls to this method
changingCheckboxState = true;
// Set all the checkboxes to match the state of this one
foreach(ListViewItem item in lvBase.Items)
{
item.Checked = e.CurrentValue != CheckState.Checked;
}
// Now that we're done, set our flag to false again
changingCheckboxState = false;
}