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;
}
}
}
}
我在另一个论坛上发现了完全相同的问题(如下)。不幸的是没有给出解决方案。我是这个论坛的新手,已经提交了另外 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;
}
}
}
}