解决 DataGridView特定行设置为CheckBox-如何检查CheckBox的状态

tim8w

知名会员
已加入
2020年9月8日
留言内容
58
编程经验
10+
你好
感谢在这个论坛中的帮助,我使CheckBox直观地工作了。如何检查CheckBox的状态?它的行为似乎很奇怪。我看了几个值,包括"Value" and "EditedFormattedValue"和非似乎正常工作。"EditedFormattedValue"似乎相反"Value" never changes from "false"无论CheckBox的物理状态如何。下面是DataGridViewCheckBoxCell定义,第二部分是DataGridView_CellMouseClick例程。

C#:
dgvQuery.Columns.Add("Column" + e.Index, clbFPYFields.SelectedItem.ToString());
if (dgvQuery.Columns.Count == 1)
{
    dgvQuery.Rows.Add();
    DataGridViewComboBoxCell cbCell = new DataGridViewComboBoxCell();
    cbCell.Items.Add("Ascending");
    cbCell.Items.Add("Descending");
    cbCell.Items.Add("[not sorted]");
    dgvQuery[0, 0] = cbCell;
    dgvQuery[0, 0].Value = "[not sorted]";
    dgvQuery.Rows[0].HeaderCell.Value = "Sort";

    dgvQuery.Rows.Add();
    DataGridViewCheckBoxCell chkCell = new DataGridViewCheckBoxCell();
    chkCell.TrueValue = true;
    chkCell.FalseValue = 假;
    dgvQuery[0, 1] = chkCell;
    dgvQuery[0, 1].Value = 假;
    dgvQuery.Rows[1].HeaderCell.Value = "Show";

    dgvQuery.Rows.Add();

    DataGridViewButtonCell btnCell = new DataGridViewButtonCell();
    btnCell.Value = "Edit";
    dgvQuery[0, 2] = btnCell;
    dgvQuery.CellMouseClick += new DataGridViewCellMouseEventHandler(dgvQuery_CellMouseClick);
    dgvQuery.Rows[2].HeaderCell.Value = "Criteria";

    dgvQuery.Rows.Add();
    dgvQuery.Rows[3].HeaderCell.Value = "Query";
    dgvQuery.Rows[3].ReadOnly = true;
}

C#:
private void dgvQuery_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    switch (e.RowIndex)
    {
        case 1:     //  Show CheckBox
            DataGridView myView = (DataGridView)sender;
            DataGridViewCheckBoxCell myCell = (DataGridViewCheckBoxCell)myView[e.ColumnIndex, e.RowIndex];
            if (Convert.ToBoolean(myCell.Value) == true)
            {
            }
            else
            {
            }

            break;
        case 2:     //  Edit Button
            frmCriteria frmShowCriteria = new frmCriteria();
            DialogResult drButton;
            sQueryField = dgvQuery.Columns[e.ColumnIndex].HeaderCell.Value.ToString();
            if (dgvQuery[e.ColumnIndex, 3].Value != null)
                sSQLQuery = dgvQuery[e.ColumnIndex, 3].Value.ToString();
            else
                sSQLQuery = "";
            drButton = frmShowCriteria.ShowDialog();
            if (drButton == System.Windows.Forms.DialogResult.OK)
            {
                dgvQuery[e.ColumnIndex, 3].Value = sSQLQuery;
            }
            break;
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,461
位置
悉尼,澳大利亚
编程经验
10+
The property ALWAYS contains the current value of the cell, no matter what type or value that may be. The CellMouseClick event is basically irrelevant for a check box cell. For any cell, if you're interested in knowing what the new value is when it changes, you handle the CellValueChanged event. If you had taken the time to read the documentation for the DataGridViewCheckBoxCell (you should pretty much ALWAYS read the documentation for new types and members, especially if they don't work the way you expect) then you'd know that the CellContentClick event is raised when the user clicks the check box but that just starts an editing session. The doesn't change until focus moves on, just like other cells. The documentation explains what to do if you want to force the to change on a click.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,434
位置
弗吉尼亚州切萨皮克
编程经验
10+
暂且不谈:自从我使用DataGridView中的复选框已经有好几年了,拥有一些隐藏的PTSD内存并没有帮助。根据您是鼠标用户还是键盘用户,DataGridView中的复选框也存在令人发指的UI不一致问题。 PTSD来自经过约两个星期与测试人员和PM一起在我们的错误数据库中进行战斗以实现PM规定的功能,但是无法由两名独立的测试人员一致验证,因此我们最终预定了会议室尝试进行现场演示,这些演示不是针对规范和焦点/启用/禁用复选框的错误。到了那里,我们终于意识到,一个测试人员一直在使用鼠标,而另一位测试人员大部分时间都在使用键盘(因为他具有可访问性测试背景)。更糟糕的是,尝试使用鼠标来设置焦点,然后使用键盘启用/禁用,其行为也会略有不同。最后,要实现PM所需的功能,我需要推出自己的DataGridCheckBoxColumn / Cell实现。从根本上来说,由于最初发现的错误,该项目的计划外工作已从零开始,并且由于全新的未经测试的代码库而增加了可能出现更多新错误的可能性。 PTSD的好食谱。

现在回到主题: @jmcilhinney 在阅读文档方面有足够的金钱。实际上,DataGridView文档以及有关如何扩展它的文档都写得很好。我不知道它们是否仍然可用,但是如果您可以找到它们,它们就是黄金:Regis Bird关于DataGridView的文章,帖子和演示。它们中嵌入了许多设计理念,这为文档增添了细微差别,以了解事物以其工作方式运作的原因。
 

tim8w

知名会员
已加入
2020年9月8日
留言内容
58
编程经验
10+
感谢您的评论和指导。
文档非常适合DataGridViewCheckBoxCell和DataGridViewButtonCell。我最终使用CurrentCellDirtyStateChanged并调用了CommitEdit,后者触发了CellValueChanged。
 
Last edited:
最佳 底部