【问题标题】:Cannot get check value from DataGridViewCheckBoxColumn. Cannot cast cell value to bool C#无法从 DataGridViewCheckBoxColumn 获取检查值。无法将单元格值转换为布尔 C#
【发布时间】:2021-02-24 22:48:51
【问题描述】:

我在 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());

    }
}

【问题讨论】:

  • 您可能能够将 Cell 转换为 DataGridViewCheckBoxCell 但几乎没有它的 Value - 您还应该在最后一行添加一对括号代码:chk = (bool)(row.Cells["VerificationStatus"].Value);
  • 但是你是对的,当只是将值转换为 bool 时,它会给我一个“指定的转换无效”错误。我更改了我原来的帖子以反映这一点。
  • 演员表总是指非常下一个实体,这里它应该是值,但在你的代码中它是row。改为chk = (bool)(row.Cells["VerificationStatus"].Value);
  • 添加了括号并得到了同样的错误。我只是不明白。
  • 值是==DbNull.Value吗?

标签: c# winforms datagridview


【解决方案1】:

所以...我不知道为什么会发生此错误,但我意识到 Value 仍然给出“真实”值,因此我将其更改为 row.Cells["VerificationStatus"] 而不是 bool。值.ToString();并制作了 if (chk == "true") 并且有效。去图吧。

【讨论】:

  • 我没有不尊重的意思,只是想提供帮助。首先,我很高兴您找到了另一个“解决方法”解决方案。但是,我想指出,像 “我不知道为什么会发生这个错误” 这样的 cmets 并屈服于从不理解错误及其发生的原因,只是添加了一些额外的“解决方法” ”代码,以后会回来咬你的。特别是在学习时,了解“为什么”会发生错误以及“如何”正确修复它们是非常重要的。否则,这些日子之一,没有“解决方法”将修复错误。只是提醒一下,祝你好运。
  • 我理解你并完全同意。我敢打赌,您提供的解决方案也会起作用,但我只是决定这种解决方法比回溯我已经拥有的更容易。但这也不会告诉我为什么会发生这个错误,就像我说我在另一行中没有错误地投射了同一个对象,所以我的理性是这只是我的 IDE 的一个问题。感谢您的帮助,尽管我肯定会再次需要它!
【解决方案2】:

您将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
             }
       }
}

【讨论】:

  • 一开始我有这样的想法,改变了我原来的帖子以显示我最初拥有的内容,当将单元格值转换为 bool 时,它在该行上给我一个“指定的转换无效”错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2023-03-09
相关资源
最近更新 更多