如何通过按一个来选中所有复选框?

时间:2018-12-11 02:01:17

标签: c# winforms checkbox

我想通过从ListView中选择一个复选框来自动从ListView中选择所有复选框来编写代码。

我使用的是Visual Studio 2005,因此没有ItemChecked表单。 那就是为什么我想通过使用ListView itemcheck事件来做到这一点。这是我的代码。

enter image description here

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
         }
     } 
}

您能帮我填写一下吗?或者,如果您有更好的主意,请分享:)

2 个答案:

答案 0 :(得分:1)

使用ListViewItem.Selected属性:

?

答案 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;
}