我如何只监听来自用户输入的 DateTimePicker ValueChanged 事件
How do I only listen for DateTimePicker ValueChanged Event from user input
我使用 DateTimePicker 输入事件将最大日期设置为昨天的日期,因为我无法控制用户是否决定让应用程序打开几天。
我还使用 DateTimePicker ValueChanged 事件根据所选日期调整我的对话。
我遇到的问题是,每次通过Enter Event调整Max Date时,ValueChanged Event也会被调用,从DateTimePicker中获取的值不是用户值。我可以做些什么来只监听用户的输入变化吗?
DateTimePicker CloseUp 似乎有帮助,但前提是用户使用日历选择日期而不是手动输入日期。
private void dtpStartDate_Enter(object sender, EventArgs e)
{
// Reports cannot be generated later than today.
dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
}
private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
DateTime startDate = dtpStartDate.Value.Date;
DateTime endDate = dtpEndDate.Value.Date;
dtp_CustomExclusionFrom.MinDate = startDate;
dtp_CustomExclusionFrom.MaxDate = endDate;
dtp_CustomExclusionTo.MinDate = startDate;
dtp_CustomExclusionTo.MaxDate = endDate;
foreach (ListViewItem item in lv_CustomExclusionDates.Items)
{
String dateString = item.Text;
DateTime exclusionDate = DateTime.Parse(dateString);
if (exclusionDate < startDate ||
exclusionDate > endDate)
{
lv_CustomExclusionDates.Items.Remove(item);
}
}
}
我希望 ValueChanged 事件仅由用户触发,而不是由 DateTimePicker 的 MaxDate 更改触发。
使用布尔字段作为标志。
private bool isChangedFromCode = false;
private void dtpStartDate_Enter(object sender, EventArgs e)
{
isChangedFromCode = true;
// Reports cannot be generated later than today.
dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
isChangedFromCode = false;
}
private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
if(isChangedFromCode) { return; }
// rest of the code here...
}
更新
根据我们在评论中的对话 - 您的 dtpStartDate_Enter
事件处理程序中的代码不是触发 ValueChanged
事件的代码,因为它仅更改 MaxDate
属性 而不是 DateTimePicker
.
的 Value
属性
您需要用该布尔标志包装设置 Value
属性 的代码的任何部分。
事实上,如果您在代码中有多个位置更改值,我可能会将其作为一种方法 - 并且仅使用此方法而不是直接设置 Value
属性:
private void SetDateTimePickerValue(DateTime value)
{
isChangedFromCode = true;
dtpStartDate.Value = value;
isChangedFromCode = false;
}
我使用 DateTimePicker 输入事件将最大日期设置为昨天的日期,因为我无法控制用户是否决定让应用程序打开几天。
我还使用 DateTimePicker ValueChanged 事件根据所选日期调整我的对话。
我遇到的问题是,每次通过Enter Event调整Max Date时,ValueChanged Event也会被调用,从DateTimePicker中获取的值不是用户值。我可以做些什么来只监听用户的输入变化吗?
DateTimePicker CloseUp 似乎有帮助,但前提是用户使用日历选择日期而不是手动输入日期。
private void dtpStartDate_Enter(object sender, EventArgs e)
{
// Reports cannot be generated later than today.
dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
}
private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
DateTime startDate = dtpStartDate.Value.Date;
DateTime endDate = dtpEndDate.Value.Date;
dtp_CustomExclusionFrom.MinDate = startDate;
dtp_CustomExclusionFrom.MaxDate = endDate;
dtp_CustomExclusionTo.MinDate = startDate;
dtp_CustomExclusionTo.MaxDate = endDate;
foreach (ListViewItem item in lv_CustomExclusionDates.Items)
{
String dateString = item.Text;
DateTime exclusionDate = DateTime.Parse(dateString);
if (exclusionDate < startDate ||
exclusionDate > endDate)
{
lv_CustomExclusionDates.Items.Remove(item);
}
}
}
我希望 ValueChanged 事件仅由用户触发,而不是由 DateTimePicker 的 MaxDate 更改触发。
使用布尔字段作为标志。
private bool isChangedFromCode = false;
private void dtpStartDate_Enter(object sender, EventArgs e)
{
isChangedFromCode = true;
// Reports cannot be generated later than today.
dtpStartDate.MaxDate = DateTime.Now.Date.AddDays(-1.0);
isChangedFromCode = false;
}
private void dtpStartDate_ValueChanged(object sender, EventArgs e)
{
if(isChangedFromCode) { return; }
// rest of the code here...
}
更新
根据我们在评论中的对话 - 您的 dtpStartDate_Enter
事件处理程序中的代码不是触发 ValueChanged
事件的代码,因为它仅更改 MaxDate
属性 而不是 DateTimePicker
.
的 Value
属性
您需要用该布尔标志包装设置 Value
属性 的代码的任何部分。
事实上,如果您在代码中有多个位置更改值,我可能会将其作为一种方法 - 并且仅使用此方法而不是直接设置 Value
属性:
private void SetDateTimePickerValue(DateTime value)
{
isChangedFromCode = true;
dtpStartDate.Value = value;
isChangedFromCode = false;
}