如何计算和比较datagridview c#中的数字

How to count and compare number in datagirdview c#

加载表单时,我有标签“Hardwork”和 1 个 datagirdview 显示。我使用下面的代码在“TotalTime”列中进行数量比较。如果该值在“TotalTime”> = 30 列中,我想要标签“Harwork”+ 1

但不是 run.the 结果是:指定的转换无效。

请帮我解决一下

public void BtnSearch_Click(object sender, EventArgs e)

       {
           db = new DbConnector();
           lbTotal.Text = "00";

           db.fillDataGridView("select *from tbl_WorkLoad where TimeComplete Between'" + dateTimePicker1.Value.ToString("dd-MM-yy| HH:mm:tt") + "' and '" + dateTimePicker2.Value.ToString("dd-MM-yy| HH:mm:tt") + "'", dataGridView1);

           const string HardWorkLabelText = "Hard Work Count: {0}";
           const int HardWorkThreshold = 30;

           try
           {
               IEnumerable<DataGridViewRow> rows = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => ((Int32)r.Cells["TotalTime"].Value) >= HardWorkThreshold);

               lbHardwork.Text = string.Format(HardWorkLabelText, rows.Count());

               {
                   for (int i = 0; i < dataGridView1.Rows.Count; i++)
                   {
                       lbTotaltime.Text = (Convert.ToString(double.Parse(lbTotaltime.Text) + double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString())));

                  
           }
           catch (Exception ex)
           {

               MessageBox.Show(ex.Message.ToString());
           }
       }

除了异常,代码中几乎没有其他问题。但让我们关注您报告的问题。

从代码中了解到,你要显示努力的次数,还要显示努力的总时间。

由于您正在遍历 gridview 的行,因此您可以在 for 循环中计算这两者。

var hardworkCount = 0;
var totalTimeSum = 0.0;

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    double totalTime = double.Parse(dataGridView1.Rows[i].Cells[7].Value.ToString());

    if(totalTime >= HardWorkThreshold)
    {
        hardworkCount++;
    }
    totalTimeSum  += totalTime;
}
lbHardwork.Text = hardworkCount.ToString();
lbTotaltime.Text = totalTimeSum.ToString();

如果您不再将数据从 datagridview 中提取出来,而是让您的 datagridview 基于保存数据的数据表,您的生活将会简单得多。可能已经是这样了,但是我们看不到你的 filldatagridview 方法的定义

这是我的做法:

//assuming sql sevrer, use correct dataadapter for your db
using(var da = new SqlDataAdapter "select * from tbl_WorkLoad where TimeComplete Between @a and @b", "YOUR CONNECTION STRING HERE")){
  da.SelectedCommand.Parameters.AddWithValue("@a", dateTimePicker1.Value);
  da.SelectedCommand.Parameters.AddWithValue("@b", dateTimePicker2.Value);

  var dt = new DataTable();

  da.Fill(dt);

  dataGridViewX.DataSource = dt;

  lbHardwork.Text = dt.Compute("Count([TotalTime])", "[TotalTime] >= 30").ToString();
  lbTotalTime.Text = dt.Compute("Sum([TotalTime])", "[TotalTime] >= 30").ToString();

}
 

您编写 SQL 的方式是一种模式,如果与字符串一起使用,则存在 SQL 注入风险 - 始终在 SQL 中使用参数。总是。在处理数据值时,没有理由不这样做。 See why, and also here

在 SQL 服务器中对字符串使用 AddWithValue 之前,您应该阅读 this blog。有比 AWV 更好的方法来处理参数,但至少使用 AddWithValue 比你现在正在做的更好

不要通过网格访问网格视图中的数据;将网格绑定到数据表,如果需要数据,请访问数据表。如果你想在任何时候从网格中获取数据表,你可以使用 var dt = datagridviewX.DataSource as DataTable