【问题标题】:Windows Form->DataGridView->DataGridViewCheckBoxColumn Uncheck All Leaves One Item CheckedWindows 窗体->DataGridView->DataGridViewCheckBoxColumn 取消选中所有保留一项选中
【发布时间】:2016-10-27 12:46:25
【问题描述】:

我们在 Windows 窗体中有一个非常奇怪的问题,我们似乎无法弄清楚。

我们的 Windows 窗体有一个 DataGridView,第一列有一个 DataGridViewCheckBoxColumn。

我们添加了以下功能,允许用户移动->单击以选择此网格中的多行:

int colHit = gvLibrary.HitTest(e.X, e.Y).ColumnIndex;
        int lastRowHit;
        //mouse left click
        if (e.Button == MouseButtons.Left)
        {
            if (colHit == 0)
            {
                if (Control.ModifierKeys == Keys.Shift)
                {
                    lastRowHit = gvLibrary.HitTest(e.X, e.Y).RowIndex;
                    ShiftClickCheckBoxSetter(this.gvLibrary, int.Parse(txtFirstClickRow.Text), lastRowHit);

                }
                else
                {
                    int firstRowHit = gvLibrary.HitTest(e.X, e.Y).RowIndex;
                    txtFirstClickRow.Text = firstRowHit.ToString();
                }
            }
        }

这里是 CheckBoxSetter 代码:

  private void ShiftClickCheckBoxSetter(DataGridView dataGridView, int p, int lastRowHit)
    {
        if (p < lastRowHit)
        {
            for (int i = p; i < lastRowHit; i++)
            {
                dataGridView.Rows[i].Cells[0].Value = true;
            }
        }
        else//
        {
            for (int i = p; i >= lastRowHit; i--)
            {
                dataGridView.Rows[i].Cells[0].Value = true;
            }
        }
    }

这是按预期工作的。

我们还为控件添加了一个 ContextMenuStrip 用于右键单击事件。

 else if (e.Button == MouseButtons.Right)
        {
            if (colHit != 0)
            {
                ContextMenuStrip m = new ContextMenuStrip();
                m.Items.Add("Select All", null, m_LibraryItemClicked);
                m.Items.Add("Select None", null, m_LibraryItemClickedNone);
                m.Show(gvLibrary, e.Location);
            }
        }

代表活动一:

     void m_LibraryItemClicked(object sender, EventArgs e) {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected) {
                dgvr.Selected = false;
            }

            dgvr.Cells["LSelect"].Value = true;
        }
    }

代表活动二:

 private void m_LibraryItemClickedNone(object sender, EventArgs e)
    {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected)
               dgvr.Selected = false;

            dgvr.Cells["LSelect"].Value = false;
        }
    }

这允许用户为复选框选择全部或不选择。

选择选择所有选择时,检查所有复选框:

但是,选择“选择无”选项时:

所有复选框都被取消选中,除了在 Shift-Click 事件中选中的最后一个:

我认为遍历所有网格行并将复选框设置为未选中就足够了,IE:

 private void m_LibraryItemClickedNone(object sender, EventArgs e)
    {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected)
               dgvr.Selected = false;

            dgvr.Cells["LSelect"].Value = false;
        }
    }

但是,似乎有某种状态属性不允许更改该行中的此复选框。

提前致谢。

【问题讨论】:

  • 您是否尝试过使用断点调试整个场景?
  • 是的,我们已经做到了。谢谢

标签: c# windows winforms checkbox datagridview


【解决方案1】:

我检查了您的代码并且可以重现此行为。问题似乎与当前单元格(而不是所选单元格)有关。当您尝试更改此特定单元格时,该操作不会立即执行。

要更改此行为,请在更改“LSelect”单元格的值之前添加dataGridView1.CurrentCell = null;。这应该可以解决您的问题。

private void m_LibraryItemClickedNone(object sender, EventArgs e)
{
    dataGridView1.CurrentCell = null;    
    foreach (DataGridViewRow dgvr in gvLibrary.Rows)
    {
        if (dgvr.Selected)
           dgvr.Selected = false;

        dgvr.Cells["LSelect"].Value = false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2014-05-06
    • 2013-01-19
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多