Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TextChanged希望在用户输入日期后进行验证,但在用户输入日期时进行验证_C#_Textbox_Datetimepicker_Textchanged - Fatal编程技术网

C# TextChanged希望在用户输入日期后进行验证,但在用户输入日期时进行验证

C# TextChanged希望在用户输入日期后进行验证,但在用户输入日期时进行验证,c#,textbox,datetimepicker,textchanged,C#,Textbox,Datetimepicker,Textchanged,大家好,对于大多数程序员来说,这一定是一个简单的逻辑,但我无法理解 我的windows窗体上有2个datetimepicker datetimepicker 1=fromdate datetimepicker 2=todate 从下面的sql中获取的起始日期和截止日期 SELECT MIN(TransDate) AS mindate, MAX(TransDate) AS maxdate FROM dbo.EtimePunchDetail WHERE (EmpID = @empid) f

大家好,对于大多数程序员来说,这一定是一个简单的逻辑,但我无法理解

我的windows窗体上有2个datetimepicker datetimepicker 1=fromdate datetimepicker 2=todate

从下面的sql中获取的起始日期和截止日期

   SELECT MIN(TransDate) AS mindate, MAX(TransDate) AS maxdate 
FROM dbo.EtimePunchDetail WHERE (EmpID = @empid)
fromdate=mindate和todate=maxdate

fromdate.mindate=mindate todate.maxdate=maxdate(“因此用户仅使用选定的日期范围”)

我添加了两个带有搜索功能的文本框,用户可以在其中输入fromdate和todate,它会检查mindate和maxdate,如果用户输入的日期超出范围,我会设置消息框抛出错误

我更改了一个文本框,即使它有以下查询:

      private void Min_TextChanged(object sender, EventArgs e)
        {

              DateTime date = DateTime.Parse(Min.Text);

              if (date < DateTime.Parse(AvailableMin.Text))
               {
                   MessageBox.Show("The Date you entered is either out of range or an invalid format");
                }
              else
                {
                  FromDate.MinDate = date;
                  FromDate.Value = date;
                }
        }
private void Max_TextChanged(object sender, EventArgs e)
    {
         DateTime date = DateTime.Parse(Max.Text);

         if (date > DateTime.Parse(AvailableMax.Text))
         {
            MessageBox.Show("The Date you entered is either out of range or an invalid format");
         }
         else
         {
            ToDate.MaxDate = date;
            ToDate.Value = date;
         }
         }
对datetimepicker值的验证

private void FromDate_ValueChanged_1(object sender, EventArgs e)
          {
         if (empchanging == false)
         {
          if (FromDate.Value > ToDate.Value)
           {
             // MessageBox.Show("From Date Cannot Be Greater Than To Date");
                 if (DialogResult.OK == MessageBox.Show("From Date Cannot Be Greater Than To Date"))
                 {
                  FromDate.MinDate = DateTime.Parse(AvailableMin.Text);
                  FromDate.Value = FromDate.MinDate;

                }
              }
          }
         }
      private void ToDate_ValueChanged_1(object sender, EventArgs e)
       {
       if (empchanging == false)
       {
       if (ToDate.Value < FromDate.Value)
       {
      //MessageBox.Show("To Date Cannot Be Less Than From Date");
        if (DialogResult.OK == MessageBox.Show("To Date Cannot Be Less Than From Date"))
         {
         ToDate.MaxDate = DateTime.Parse(AvailableMax.Text);
         ToDate.Value = ToDate.MaxDate;
        }
     }
    }
     }
我尝试了以下解决方案

 private void Min_TextChanged(object sender, EventArgs e)
 {
  DateTime date; 
if (!DateTime.TryParse(Min.Text, out date))
       {
formerrorprovider.SetError(this.Min,"The Date you entered is in invalid format");
  }
   else if (date < DateTime.Parse(AvailableMin.Text))
 {
  formerrorprovider.SetError(this.Min, "The Date you entered is either out of range");
     }
    else 
   {
   formerrorprovider.SetError(this.Min, string.Empty);
    FromDate.MinDate = date;
    FromDate.Value = date;
     }
private void Min\u TextChanged(对象发送方,事件参数e)
{
日期时间日期;
如果(!DateTime.TryParse(Min.Text,out-date))
{
formerrorprovider.SetError(this.Min,“您输入的日期格式无效”);
}
else if(日期
它接受我输入的日期,但干扰了datetimepicker验证。


PLZ帮助

作为一种可能的UI解决方案:如果日期无效,则不显示消息框,而是添加ErrorProvider控件以形成并将错误描述设置为最大和最小文本框。如果有不正确的数据,则错误提供程序将显示错误图标,并在输入可接受时将其隐藏

private void Max_TextChanged(object sender, EventArgs e)
{
     DateTime date;

     if (!DateTime.TryParse(Max.Text, out date))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is in invalid format");
     }
     else if (date > DateTime.Parse(AvailableMax.Text))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is out of range");
     }
     else
     {
        formErrorProvider.SetError(this.Max, string.Empty);
        ToDate.MaxDate = date;
        ToDate.Value = date;
     }
}

作为一种可能的UI解决方案:如果日期无效,则不显示MessageBox,而是将ErrorProvider控件添加到表单中,并将errors description设置为Max和Min TextBox。如果存在错误数据,则Error provider将显示错误图标,并在可接受输入时将其隐藏

private void Max_TextChanged(object sender, EventArgs e)
{
     DateTime date;

     if (!DateTime.TryParse(Max.Text, out date))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is in invalid format");
     }
     else if (date > DateTime.Parse(AvailableMax.Text))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is out of range");
     }
     else
     {
        formErrorProvider.SetError(this.Max, string.Empty);
        ToDate.MaxDate = date;
        ToDate.Value = date;
     }
}

您的代码执行的正是您要求它执行的操作:它在文本发生更改时验证值

如果这不是你想要的行为,那就不要这样做

例如,您可能更喜欢验证或事件上的值。或者,您可以利用
控件
类中的现有验证模型,将验证放在作为事件的事件处理程序的方法中(在
离开
LostFocus
事件之间引发)


另一个建议——以较少干扰的方式呈现用户反馈——也是一个非常好的建议。总体而言,这将更加用户友好,但可能会导致用户反馈更加微妙,更容易被用户忽略。

您的代码正是按照您的要求执行的:它正在验证值只要文本发生变化

如果这不是你想要的行为,那就不要这样做

例如,您可能更喜欢验证或事件上的值。或者,您可以利用
控件
类中的现有验证模型,将验证放在作为事件的事件处理程序的方法中(在
离开
LostFocus
事件之间引发)


另一个建议——以较少干扰的方式呈现用户反馈——也是一个非常好的建议。总体而言,这将更加用户友好,但可能会导致用户反馈更加微妙,更容易被用户忽略。

是否仅当用户尝试将焦点移到另一个位置时才验证输入r控件,即当他们完成输入值时?@HABO当他们完成输入值时,这就是为什么即使我删除了2015中的5,消息框也会弹出消息,如果每次文本更改时我尝试清除文本框,那么我得到的错误字符串无法识别。FWIW,我通常发现它是frien当用户说他们已经完成时,更容易验证所有输入,例如,他们单击
运行报告
。这样,您就不会让他们玩游戏,试图找出他们必须更改字段的顺序,例如
从日期
不得晚于
到日期
,但如果您想更改这两个字段,您可能没有o从第一个更改。他们可以随心所欲地剪切、粘贴、调整和修改。当然,在数据输入过程中,您可能不允许在员工条形码中使用数字以外的字符,但这不是验证。@HABO这正是我所做的,事实上,我又添加了两个文本框,用于存储用户输入的文本框值,并制作了vVisibility false,然后在单击按钮后根据可用的最小值和最大值进行验证。是否仅当用户尝试将焦点移动到另一个控件时,即当他们完成输入值时,才验证输入?@HABO当他们完成输入值时,这就是为什么即使我在2015年删除了5个控件时,仍要验证输入值“年龄框”会弹出消息,如果每次文本更改时我都尝试清除文本框,那么我会发现错误字符串未被识别。FWIW,我通常发现,当用户说他们已完成输入时,验证所有输入更为友好,例如,他们单击
运行报告
。这样你就不会让他们玩“尝试”的游戏要确定他们必须更改字段的顺序,例如,从日期开始的
不得晚于到日期为止的
,但如果您想更改这两个字段,则可能必须从第一个字段开始更改。他们可以根据自己的心意剪切、粘贴、调整和修改。当然,员工栏中可能不允许使用数字以外的字符数据输入过程中进行de,但这不是验证。@HABO这正是我所做的,我承认
private void Max_TextChanged(object sender, EventArgs e)
{
     DateTime date;

     if (!DateTime.TryParse(Max.Text, out date))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is in invalid format");
     }
     else if (date > DateTime.Parse(AvailableMax.Text))
     {
        formErrorProvider.SetError(this.Max, "The Date you entered is out of range");
     }
     else
     {
        formErrorProvider.SetError(this.Max, string.Empty);
        ToDate.MaxDate = date;
        ToDate.Value = date;
     }
}