如果条件与日期时间选择器&;datagridview单元格日期

本文关键字:日期 amp datagridview 单元格 选择器 条件 时间 如果 | 更新日期: 2024-10-18 14:53:38

我是C#编程的新手&我缺乏编码方面的知识。所以请帮帮我。

我有datagridview(以下简称dgv),没有绑定到任何数据源。dgv正在从一些文本框提供数据&表单上的datetimepicker(以下简称dtp)。我想在用户向dgv输入数据之前检查if条件。请参阅下面的代码,

private void FEAdd_Click(object sender, EventArgs e)
   {
       var boxes = new List<TextBox>
       {
           MtrtextBox1,
           PltrtextBox11,
           BvtextBox12,
       };
       if (boxes.Any(tb => string.IsNullOrEmpty(tb.Text)))
       {
           MessageBox.Show("Fill required fields", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
           MtrtextBox1.BackColor = Color.Red;
           BvtextBox12.BackColor = Color.Red;
       }
       else if (dgvFE.RowCount >= 1 && (Convert.ToDateTime(dgvFE.Rows[dgvFE.RowCount - 1].Cells[0].Value.ToString()) > dateTimePicker1.Value.Date))
           {
               MessageBox.Show("Current bill date cannot be less than the previous bill date.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
           }
       else
       {
           int n = dgvFE.Rows.Add();
           dgvFE.Rows[n].Cells[0].Value = dateTimePicker1.Value.ToString("dd-MM-yyyy");
           dgvFE.Rows[n].Cells[1].Value = MtrtextBox1.Text.ToString();
           dgvFE.Rows[n].Cells[3].Value = PltrtextBox11.Text.ToString();
           dgvFE.Rows[n].Cells[4].Value = BvtextBox12.Text.ToString();

           foreach (DataGridViewRow row in dgvFE.Rows)
           {
               dgvFE.Rows[row.Index].Cells[2].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index].Cells[4].Value.ToString()) / Double.Parse(dgvFE.Rows[row.Index].Cells[3].Value.ToString())), 2).ToString();
               if (n >= 1 && row.Index > 0)
               {
                   dgvFE.Rows[row.Index - 1].Cells[5].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index].Cells[1].Value.ToString()) - Double.Parse(dgvFE.Rows[row.Index - 1].Cells[1].Value.ToString())), 2).ToString();
                   dgvFE.Rows[row.Index - 1].Cells[6].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index - 1].Cells[5].Value.ToString()) / Double.Parse(dgvFE.Rows[row.Index - 1].Cells[2].Value.ToString())), 2).ToString();
               }

           }
           MtrtextBox1.Text = null;
           BvtextBox12.Text = null;
           MtrtextBox1.BackColor = Color.White;
           BvtextBox12.BackColor = Color.White;
       }
   }

用户可以毫无问题地将第一行数据输入到dgv。但如果用户在dgv中输入的日期小于Cell[0]日期,则会显示我的错误消息框。也可以。然后用户应该在dgv中输入比Cell[0]更高的日期。但问题来了。它总是显示消息框,即使用户选择的日期高于dgv上的Cell[0]日期。有人能帮我吗?我在谷歌上搜索了一下,没有找到任何解决方案。抱歉我英语不好。

如果条件与日期时间选择器&;datagridview单元格日期

在将字符串转换为日期时,我们应该注意date format

以下代码可能适用于您。我建议添加断点或警报语句来查看实际的运行时值,有时这会给你一个答案。

   private void FEAdd_Click(object sender, EventArgs e)
   {
       var boxes = new List<TextBox>
       {
           MtrtextBox1,
           PltrtextBox11,
           BvtextBox12,
       };
       if (boxes.Any(tb => string.IsNullOrEmpty(tb.Text)))
       {
           MessageBox.Show("Fill required fields", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
           MtrtextBox1.BackColor = Color.Red;
           BvtextBox12.BackColor = Color.Red;
           return;
       }
       else if (dgvFE.Rows.Count > 0)          
         {
             DateTime dt1 = DateTime.ParseExact(dgvFE.Rows[dgvFE.RowCount - 1].Cells[0].Value.ToString(), "dd-MM-yyyy", CultureInfo.InvariantCulture); // careful about date formats.
             DateTime dt2 = dateTimePicker1.Value.Date;
             if(dt1>dt2)
             { 
                 MessageBox.Show("Current bill date cannot be less than the previous bill date.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                 return;
             }      
         }

           int n = dgvFE.Rows.Add();
           dgvFE.Rows[n].Cells[0].Value = dateTimePicker1.Value.ToString("dd-MM-yyyy");
           dgvFE.Rows[n].Cells[1].Value = MtrtextBox1.Text.ToString();
           dgvFE.Rows[n].Cells[3].Value = PltrtextBox11.Text.ToString();
           dgvFE.Rows[n].Cells[4].Value = BvtextBox12.Text.ToString();

           foreach (DataGridViewRow row in dgvFE.Rows)
           {
               dgvFE.Rows[row.Index].Cells[2].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index].Cells[4].Value.ToString()) / Double.Parse(dgvFE.Rows[row.Index].Cells[3].Value.ToString())), 2).ToString();
               if (n >= 1 && row.Index > 0)
               {
                   dgvFE.Rows[row.Index - 1].Cells[5].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index].Cells[1].Value.ToString()) - Double.Parse(dgvFE.Rows[row.Index - 1].Cells[1].Value.ToString())), 2).ToString();
                   dgvFE.Rows[row.Index - 1].Cells[6].Value = Math.Round((Double.Parse(dgvFE.Rows[row.Index - 1].Cells[5].Value.ToString()) / Double.Parse(dgvFE.Rows[row.Index - 1].Cells[2].Value.ToString())), 2).ToString();
               }

           }
           MtrtextBox1.Text = null;
           BvtextBox12.Text = null;
           MtrtextBox1.BackColor = Color.White;
           BvtextBox12.BackColor = Color.White;      
   }