DataGridView 使用 ctrl 和 shift 键检查多个复选框

DataGridView check multiple checkboxes using the ctrl and shift keys

我在另一个论坛上发现了完全相同的问题(如下)。不幸的是没有给出解决方案。我是这个论坛的新手,已经提交了另外 2 个帖子,但遗憾的是没有人回复。希望这个能引起更多关注。提前致谢。

“我有一个 DataGridView,第 0 列是一个复选框。我启用了 multiselect 所以我可以 select 使用 Shift 和 Ctrl 的行但无法让我的复选框正确启用和禁用。我希望能够 select 行,然后 selected 单击第 0 列并选中或取消选中所有行,但发生的事情是我丢失了我的 selection 当我这样做时。目前所有内容都是只读的,除了第 0 列并且我启用了 FullRowSelect。"

我也试过我喜欢的 CellClick 事件。

我的代码如下:

        private void dgv_Off_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex == -1) return;
        dgv_On.ClearSelection();
        int colindex = dgv_Off.CurrentCell.ColumnIndex;
        if (dgv_Off.SelectedRows.Count > 1)
        {
            foreach (DataGridViewRow dgvOff in dgv_Off.SelectedRows)
            {
                dgv_Off.Focus();
                if (colindex == 0)
                {
                    bool IsChecked = Convert.ToBoolean(dgvOff.Cells[0].Value);
                    if (IsChecked == true)
                    {
                        dgvOff.Cells[0].Value = false;
                        dgv_Off.ClearSelection();
                        dgv_Off.Update();
                    }
                    else
                    {
                        dgvOff.Cells[0].Value = true;
                        dgv_Off.ClearSelection();
                        dgv_Off.Update();
                    }
                }
            }
        }
        dgv_Off.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }

我没有完全理解你的意思...... “我希望能够 select 行,然后 selected 单击第 0 列并拥有所有选中或未选中的行,......“ ......? …您如何确定应该检查 selected 行还是 not-checked?我的意思是,如果 selected 行有选中和未选中的值 selected... 那么您怎么知道要为所有复选框设置什么值?

我假设您想将“selected”行复选框值更改为当前具有的“相反”值。换句话说,对于 selected 行,我们将遍历所有 selected 复选框并仅否定 selected 行的复选框值。如果是这种情况,那么下面的代码应该这样做。

我建议您使用网格 ColumnHeaderMouseClick 事件。当单击的列 header 是列零 (0) 时,然后遍历所有 selected 行并否定复选框当前具有的任何值。如下所示……

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
  if (e.ColumnIndex == 0) {
    foreach (DataGridViewRow row in dataGridView1.SelectedRows) {
      if (row.Cells[0].Value != null) {
        row.Cells[0].Value = !(bool)row.Cells[0].Value;
      }
      else {
        row.Cells[0].Value = true;
      }
    }
  }
}