【问题标题】:If condition with datetimepicker & datagridview cell date如果条件与 datetimepicker & datagridview 单元格日期
【发布时间】:2015-03-05 03:58:00
【问题描述】:

我是 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] 日期,它也始终显示消息框。谁能帮我解决这个问题?我用谷歌搜索并没有找到任何解决方案。对不起我的英语不好。

【问题讨论】:

    标签: c# if-statement datagridview datetimepicker


    【解决方案1】:

    字符串转日期时要注意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;      
    
       }
    

    【讨论】:

    • 我已根据您给定的解决方案更改了我的代码。但是当我单击添加按钮时,它什么也不做。即使日期高于 Cells[0] 日期,也没有任何行添加到 dgv
    • @IshanSasanka 你可能需要稍微修改一下你的代码。
    • 感谢@Hari Prasad。你的代码有效。我在 else if 条件下添加了 else 函数,否则 dgv 的第一行没有添加。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多