无法从 DataGridViewCheckBoxColumn 获取检查值。无法将单元格值转换为 bool C#

Cannot get check value from DataGridViewCheckBoxColumn. Cannot cast cell value to bool C#

我在 DataGridView 中有一个 DataGridViewCheckBoxColumn,用户可以在其中检查以验证项目。要检查一个项目是否已经过验证,我使用这个:

private void paymentsTbl_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        DataGridViewRow row = paymentsTbl.Rows[e.RowIndex];
        bool chk = (bool)row.Cells["VerificationStatus"].Value;
        if (chk == true)
        {
            row.ReadOnly = true;
        }
    }

这会在添加一行时触发,并且只有在某些内容已经过验证时才使该行变为可读。这行得通。所以现在,用户单击一个按钮,然后我想通过 datagridview 查看所有用户检查的内容。

private void verifyBtn_Click(object sender, EventArgs e) {
   bool chk;
   foreach(DataGridViewRow row in paymentsTbl.Rows)
   {
       if(row.ReadOnly == false)
       {                                
             chk = (bool)row.Cells["VerificationStatus"].Value;
             if (chk)
             {
                   //Do Something
             }
       }
   }
}

这不起作用。它给我一个错误:指定的转换无效。在线:

chk = (bool)row.Cells["VerificationStatus"].Value;

我一直在研究我做错了什么,但我一直在关注在线示例并得到相同的结果。有人能告诉我第一个代码如何完美运行而第二个代码却不能吗?

编辑:这是将行添加到 DGV 的方式,其中“验证”和“惩罚”都是复选框列:

using (SqlDataReader Read = Com.ExecuteReader())
{
    while (Read.Read())
    {
        if (Read["VerificationStatus"].ToString() == "VERIFIED")
        {
            verify = true;

        }
        else
        {
            verify = false;
        }

        if (Read["Penalty"].ToString() == "Y")
        {
            penalty = true;
        }
        else
        {
            penalty = false;
        }

        paymentsTbl.Rows.Add(Read["PaymentID"].ToString(), Read["PrimaryHolder"].ToString(), Read["CertificateNum"].ToString(), Read["IntStartDate"].ToString(), Read["IntEndDate"].ToString(),
            Read["PaymentAmount"].ToString(), Read["RoundedInterest"].ToString(), verify, penalty, Read["PenaltyAmt"].ToString(), Read["TotalPaid"].ToString());

    }
}

您将 chk 声明为 DataGridViewCheckBoxCell,然后尝试为其分配 bool 类型。您只需要将值放入 bool 并检查:

foreach(DataGridViewRow row in paymentsTbl.Rows)
{
       if(row.ReadOnly == false)
       {                                
             bool chk = (bool)row.Cells["VerificationStatus"].Value;
             if (chk)
             {
                   //Do Something
             }
       }
}

所以...我不知道为什么会发生此错误,但我意识到该值仍给出“真”值,因此我将其更改为 row.Cells[" VerificationStatus"].Value.ToString();并使 if (chk == "true") 起作用。去图吧。