【问题标题】:Trap the invalid Value for datetimepicker in C#在 C# 中捕获 datetimepicker 的无效值
【发布时间】:2017-01-20 17:47:46
【问题描述】:

我在文本框和数据库中的 datetimepicker 中显示数据。但是有些记录是空的,在datetimepicker中显示是无效的。我想捕获每个空日期以在 datetimepicker 中设置 null。到目前为止我有这个代码:

   if ((myReader["Born"].ToString()) == "" &&      (myReader["Died"].ToString()) != "" && (myReader["Interment"].ToString()) != "")
                {
                    textBox1.Text = (myReader["Surname"].ToString());
                    textBox2.Text = (myReader["FirstName"].ToString());
                    textBox3.Text = (myReader["MI"].ToString());
                    textBox4.Text = (myReader["Sex"].ToString());
                    dateTimePicker1.Format = DateTimePickerFormat.Custom;
                    dateTimePicker1.CustomFormat = " ";
                    dateTimePicker2.Value = Convert.ToDateTime(myReader["Died"].ToString());
                    textBox7.Text = (myReader["Age"].ToString());
                    dateTimePicker3.Value = Convert.ToDateTime(myReader["Interment"].ToString());
                    textBox9.Text = (myReader["Area"].ToString());
                }
                else if ((myReader["Died"].ToString()) == "" && (myReader["Born"].ToString()) != "" && (myReader["Interment"].ToString()) != "")
                {
                    textBox1.Text = (myReader["Surname"].ToString());
                    textBox2.Text = (myReader["FirstName"].ToString());
                    textBox3.Text = (myReader["MI"].ToString());
                    textBox4.Text = (myReader["Sex"].ToString());
                    dateTimePicker1.Value = Convert.ToDateTime(myReader["Born"].ToString());
                    dateTimePicker2.Format = DateTimePickerFormat.Custom;
                    dateTimePicker2.CustomFormat = " ";
                    textBox7.Text = (myReader["Age"].ToString());
                    dateTimePicker3.Value = Convert.ToDateTime(myReader["Interment"].ToString());
                    textBox9.Text = (myReader["Area"].ToString());
                }
                else if ((myReader["Interment"].ToString()) == "" && (myReader["Born"].ToString()) != "" && (myReader["Died"].ToString()) == "")
                {
                    textBox1.Text = (myReader["Surname"].ToString());
                    textBox2.Text = (myReader["FirstName"].ToString());
                    textBox3.Text = (myReader["MI"].ToString());
                    textBox4.Text = (myReader["Sex"].ToString());
                    dateTimePicker1.Value = Convert.ToDateTime(myReader["Born"].ToString());
                    dateTimePicker2.Value = Convert.ToDateTime(myReader["Died"].ToString());
                    textBox7.Text = (myReader["Age"].ToString());
                    dateTimePicker3.Format = DateTimePickerFormat.Custom;
                    dateTimePicker3.CustomFormat = " ";
                    textBox9.Text = (myReader["Area"].ToString());
                }

【问题讨论】:

  • DTP 不接受空/空日期
  • 它们是作为日期还是字符串存储在数据库中?
  • 字符串@Peter4499
  • 既然你不能将 DateTimePicker 设置为 null,你想做什么?
  • @KSib 此代码有效,我可以将 datetimepicker 设置为 null 但不完整且太长。我想将其最小化并完全捕获无效。

标签: c# mysql


【解决方案1】:

“我想捕获每个空日期以在 datetimepicker 中设置 null。到目前为止,我有这段代码”- 下面的代码与原始代码做同样的事情,但应该处理其他无效日期的情况。

“此代码有效,我可以将 datetimepicker 设置为 null 但不完整且太长。我想将其最小化并完全捕获无效。” 原始代码没有将其设置为空,下面的代码做同样的事情。

“我想最小化它并完全捕获无效” - 这就是下面的代码。

textBox1.Text = myReader["Surname"].ToString();
textBox2.Text = myReader["FirstName"].ToString();
textBox3.Text = myReader["MI"].ToString();
textBox4.Text = myReader["Sex"].ToString();
textBox7.Text = myReader["Age"].ToString();
textBox9.Text = myReader["Area"].ToString();
trySetDateTimePickerValue(myReader["Born"], dateTimePicker1);
trySetDateTimePickerValue(myReader["Died"], dateTimePicker2);
trySetDateTimePickerValue(myReader["Interment"], dateTimePicker3);

// ...

public void trySetDateTimePickerValue(DateTimePicker dateTimePicker, SomeTypeOfReader reader)
{
    if (reader != null)
    {
        string cleanDate = reader.ToString().Trim(); 
        if (cleanDate.Length > 0) // maybe this trim/test is overkill, maybe the TryParse below is sufficient
        {
            DateTime parsedDate = DateTime.MinValue;
            if (DateTime.TryParse(cleanDate, out parsedDate)
            {
                dateTimePicker.Value = parsedDate;
                return; // success - exit method
            }
        }
    }

    // no valid date in string:

    // this is the default value if no value is set according to MSDN
    dateTimePicker.Value = DateTime.Now;

    // show nothing in the picker (not sure if this is good solution, this is what the original code does)
    dateTimePicker.Format = DateTimePickerFormat.Custom;
    dateTimePicker.CustomFormat = " ";

}

代码保留了原始的错误对象名称(textBox1、textBox2、...)

另请注意,代码具有文化敏感性,日期时间解析在不同的语言环境中可能表现不同(就像原始代码一样)。如果需要,为日期时间解析方法提供额外的参数以指定文化。

【讨论】:

    【解决方案2】:

    强烈建议重构代码,因为几乎相同的代码块重复了 3 次,使代码极难阅读。拆分相同的部分,只将不同的部分放在 if 子句中。

    至于解决实际问题,这样的事情应该可行:

    setDateTimerPickerValueIfExists(dateTimePicker1, myReader["Born"]);
    setDateTimerPickerValueIfExists(dateTimePicker2, myReader["Died"]);
    
    //..
    
    private void setDateTimerPickerValueIfExists(DateTimePicker dateTimePicker, xxxxxxxReader reader) {
        if (reader != null) {
            dateTimePicker.Value = Convert.ToDateTime(reader.ToString());
        }
    }
    

    【讨论】:

    • 我是新来的,但为什么要投反对票? o_O 如果答案不好或不正确,很高兴知道原因。
    • 我没有对你投反对票,但我看不出这会将 DateTimePicker 设置为 null 的位置。我仍在试图弄清楚 OP 是如何将其设置为 null 的,因为这不应该是可能的,但我们会看到。
    • 在阅读了这个问题和你的讨论 20 遍之后,我认为问题在于他想要捕获更多案例并减少庞大的代码。我认为“设置为空”是指保持和隐藏其默认值(将“”设置为自定义格式),就像他在原始代码中所做的那样。我基于此提交了一个新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多