C# TextChanged希望在用户输入日期后进行验证,但在用户输入日期时进行验证
大家好,对于大多数程序员来说,这一定是一个简单的逻辑,但我无法理解 我的windows窗体上有2个datetimepicker datetimepicker 1=fromdate datetimepicker 2=todate 从下面的sql中获取的起始日期和截止日期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
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;
}
}