峰峦@叠嶂 2024-07-01 11:31 采纳率: 99.5%
浏览 3
已结题

datagridveiw的运算结果不正常,请指导一下;

各位好,我查询数据表,查询的同时完成针对工资Salary的基础运算,并保存到数据表里面,如下图的search事件里面,然后再在CellEndEdit,完成工资Salary + 奖励reward - 扣罚PAmount,,但在运行时,计算的结果总不正确,计算前如第一图0700,计算后如第二图0701,请给排查一下,谢谢;

img


img


private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{

    DataGridViewRow currentRow = dataGridView1.Rows[e.RowIndex];

    if (e.ColumnIndex == 8 || e.ColumnIndex == 9 || e.ColumnIndex == 10)
    {
        decimal salary = Convert.ToDecimal(currentRow.Cells[10].Value);
        decimal pAmount = Convert.ToDecimal(currentRow.Cells[9].Value);
        decimal reward = Convert.ToDecimal(currentRow.Cells[8].Value);

        decimal result = salary + reward - pAmount;

        currentRow.Cells[10].Value = result.ToString();
    }
}

  private void btnsearch_Click(object sender, EventArgs e)
  {
      using (SqlConnection Conn = new SqlConnection("server=192.168.100.247;database=Whmesinfo;User=Sa;Password=whyy@2021"))
      {
          Conn.Open();

          if ((comdate.Text == "请选择") || (string.IsNullOrEmpty( txtstandard.Text)))
          {
              MessageBox.Show("请您选择查询月份,并填入标准出勤天数");

              return;
          }

          else
          {

              try
              {
                  string startdate = comdate.Text;

                  Sqlstring = @"select * from w_TCSalary where dateInfo = @startdate";

                  SqlCommand Cmd = new SqlCommand(Sqlstring, Conn);

                  Cmd.Parameters.AddWithValue("@startdate", startdate);

                  SqlDataAdapter sda = new SqlDataAdapter(Cmd);

                  dt.Rows.Clear();
                  dt.Columns.Clear();
                  dataGridView1.Columns.Clear();

                  sda.Fill(dt);

                  dataGridView1.DataSource = dt;

                  dataGridView1.Columns[0].Visible = false;
                  dataGridView1.Columns[1].HeaderText = "日期";
                  dataGridView1.Columns[2].HeaderText = "姓名";
                  dataGridView1.Columns[3].HeaderText = "部门";
                  dataGridView1.Columns[4].HeaderText = "班组";
                  dataGridView1.Columns[5].HeaderText = "职位";

                  dataGridView1.Columns[6].HeaderText = "出勤天数";
                  dataGridView1.Columns[7].HeaderText = "现场管理";
                  dataGridView1.Columns[8].HeaderText = "奖励金额";
                  dataGridView1.Columns[9].HeaderText = "扣罚金额";
                  dataGridView1.Columns[10].HeaderText = "发放金额";

                  dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//点击全选操作

                  foreach (DataRow row in dt.Rows)
                  {
                      decimal workday = Convert.ToDecimal(row["workday"]);

                      decimal Smanage = Convert.ToDecimal(row["Smanage"]);
                      decimal Reward = Convert.ToDecimal(row["reward"]);
                      decimal Pamount = Convert.ToDecimal(row["pamount"]);
                      decimal Salary = Convert.ToDecimal(row["Salary"]);

                      decimal workstandard = string.IsNullOrWhiteSpace(txtstandard.Text) ? 0 : Convert.ToDecimal(txtstandard.Text);

                      decimal Temp;

                      if (workday / 1 > workstandard)
                      {
                          Temp = 50m;
                      }

                      else
                      {
                          Temp = Math.Round(workday / workstandard * 50, 2, MidpointRounding.AwayFromZero);

                      }

                      Salary = Smanage + Temp + Reward - Pamount;

                      row["Salary"] = Salary;
                                            
                  }

                  //完成运算后,随即对数据表执行更新操作;   
                  SqlCommandBuilder builder = new SqlCommandBuilder(sda);

                  sda.Update(dt);

                  dataGridView1.Refresh();

              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message);
              }

          }

      }
     
      
  }
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-01 11:31
    关注

    引自免费微信小程序:皆我百晓生

    你的问题主要在于更新数据库中的计算字段逻辑错误以及DataGridView的数据更新逻辑错误。根据你提供的代码,我们可以分别针对这两个问题进行解决。

    首先,在更新数据库中的计算字段时,你需要对每一行数据进行更新操作,而不是仅仅在内存中修改数据。你需要使用SqlCommand的ExecuteNonQuery方法来执行更新操作。此外,你的计算逻辑似乎不正确。你应该根据每条记录的实际情况来计算薪资,而不仅仅是针对所有的记录进行一次更新操作。此外,计算过程中出现的各种参数应该是在SQL查询语句中进行处理,而不是在内存中处理后再更新到数据库中。这样可能会导致数据不一致的问题。以下是一个可能的解决方案:

    btnsearch_Click 事件处理器中:

    try
    {
        // 连接数据库,获取数据等代码保持不变...
        SqlCommand Cmd = new SqlCommand(@"UPDATE w_TCSalary SET Salary = Smanage + (@workday / @workstandard * 50) + reward - pamount WHERE dateInfo = @startdate AND ... 其他筛选条件 ...", Conn); // 根据你的实际需求修改这里的筛选条件
        Cmd.Parameters.AddWithValue("@startdate", startdate); // 添加其他需要的参数...
        Cmd.Parameters.AddWithValue("@workday", workday); // 根据你的实际需求添加这些参数的值
        Cmd.Parameters.AddWithValue("@workstandard", workstandard); // 同上
        // 执行命令来更新数据库中的记录
        int result = Cmd.ExecuteNonQuery(); // 返回更新的行数
        MessageBox.Show("已更新 " + result + " 条记录"); // 显示更新的行数信息
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message); // 显示错误信息
    }
    

    然后在 dataGridView1_CellEndEdit 事件处理器中,你需要在DataGridView的CellValueChanged事件中处理数据的更新逻辑。你已经有一部分这样的代码了,但在实际运行之前请确保新的计算结果已成功更新到数据库中,然后再在DataGridView中显示更新后的结果。这可能需要添加一个检查过程来确认数据已经被成功更新到数据库中。同时确保你正确更新了DataGridView的数据源(dt)。这是一个可能的解决方案:

    dataGridView1_CellEndEdit 事件处理器中:

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 8 || e.ColumnIndex == 9 || e.ColumnIndex == 10) // 根据你的实际需求修改这里的列索引值
        {
            DataGridViewRow currentRow = dataGridView1.Rows[e.RowIndex]; // 获取当前行数据
            decimal salary = Convert.ToDecimal(currentRow.Cells[10].Value); // 获取当前行的薪资值
            decimal pAmount = Convert.ToDecimal(currentRow.Cells[9].Value); // 获取扣罚金额值等参数...(你可能需要根据实际的列索引进行调整)
            decimal reward = Convert.ToDecimal(currentRow.Cells[8].Value); // 获取奖励金额值等参数...(同上)等参数的值并计算新的薪资值...然后保存新的薪资值到数据库中(可以参考上面的更新数据库的逻辑)。完成后更新DataGridView中的相应单元格的值以显示新的结果。 记住检查新的计算结果是否成功保存到数据库中,如果成功再更新GridView的显示结果。如果失败则提示错误信息或者进行错误处理。这部分代码可能需要结合异步操作来避免阻塞UI线程,尤其是在数据库操作的时候。此外,请确保在操作数据库时处理好异常和错误情况,以避免数据丢失或损坏的问题。请根据实际情况进行调整和优化代码以提高效率和稳定性。希望这个解答对你有所帮助!如果你还有其他问题或者需要进一步的帮助,请随时提问。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月9日
  • 已采纳回答 7月1日
  • 创建了问题 7月1日

悬赏问题

  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令