كيفية تناول الفاصل الزمني في Datetimepicker
-
12-09-2019 - |
سؤال
انا املك DateTimePicker. التحكم في نموذج محدد مثل:
dtpEntry.Format = DateTimePickerFormat.Custom;
dtpEntry.CustomFormat = "dd/MM/yyyy hh:mm:ss";
dtpEntry.ShowUpDown = true;
أود أن يكون المستخدم قادرا على زيادة الوقت أو تقليل الزيارات بنسبة 5 دقائق.
أي اقتراحات حول كيفية تحقيق هذا؟
المحلول
من الممكن بمشاهدة الحدث Valuechanged وتجاوز القيمة. عمل نموذج العينة هذا جيدا:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
dateTimePicker1.CustomFormat = "dd/MM/yyyy hh:mm";
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.ShowUpDown = true;
dateTimePicker1.Value = DateTime.Now.Date.AddHours(DateTime.Now.Hour);
mPrevDate = dateTimePicker1.Value;
dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged);
}
private DateTime mPrevDate;
private bool mBusy;
private void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
if (!mBusy) {
mBusy = true;
DateTime dt = dateTimePicker1.Value;
if ((dt.Minute * 60 + dt.Second) % 300 != 0) {
TimeSpan diff = dt - mPrevDate;
if (diff.Ticks < 0) dateTimePicker1.Value = mPrevDate.AddMinutes(-5);
else dateTimePicker1.Value = mPrevDate.AddMinutes(5);
}
mBusy = false;
}
mPrevDate = dateTimePicker1.Value;
}
}
نصائح أخرى
لقد غيرت القليل من الإجابة من Sixothree، للقضاء على الخطأ الموجود من قبل Necromporph. يجب أن يكون على ما يرام مثل هذا:
في الفصل
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
في المنشئ
prevTimePicker1 = dateTimePickerStart.Value;
navigatingDateTimePicker = false;
الحدث
private void dateTimePickerStart_ValueChanged(object sender, EventArgs e)
{
if (!navigatingDateTimePicker) {
/* First set the navigating flag to true so this method doesn't get called again while updating */
navigatingDateTimePicker = true;
/* using timespan because that's the only way I know how to round times well */
TimeSpan tempTS = dateTimePickerStart.Value - dateTimePickerStart.Value.Date;
TimeSpan roundedTimeSpan;
TimeSpan TDBug = dateTimePickerStart.Value - prevTimePicker1;
if (TDBug.TotalMinutes == 59)
{
// first: if we are going back and skipping an hour it needs an adjustment
roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor((tempTS.TotalMinutes - 60) / 5));
dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan;
}
else if (dateTimePickerStart.Value > prevTimePicker1)
{
// round up to the nearest interval
roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Ceiling(tempTS.TotalMinutes / 5));
dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan;
} else {
// round down to the nearest interval from prev
roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor(tempTS.TotalMinutes / 5));
dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan;
}
navigatingDateTimePicker = false;
}
prevTimePicker1 = dateTimePickerStart.Value;
}
المشكلة هي أن التحكم في أعلى / أسفل يزيد تلقائيا أو يقلل من الجزء المميز حاليا من منتقي التاريخ / الوقت (أي السنة / الشهر / اليوم / اليوم / ساعة / إلخ.).
ربما تكون أفضل حالا في إضافة عنصر تحكم لأعلى / لأسفل الخاص بك (ربما vscrollbar صغير جدا) بجوار منتقي التاريخ / الوقت والأسلاك إلى زيادة / تقليل فترات من خمس دقائق من قيمة منتقي التاريخ / الوقت.
أو ببساطة محاولة هذا:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if (this.dateTimePicker1.Value.Minute % 5 == 0)
return;
if (this.dateTimePicker1.Value.Minute % 5 == 1)
this.dateTimePicker1.Value = this.dateTimePicker1.Value.AddMinutes(4);
if (this.dateTimePicker1.Value.Minute % 5 == 4)
this.dateTimePicker1.Value = this.dateTimePicker1.Value.AddMinutes(-4);
}
أعلم أن هذه مقالة قديمة، لكنني خلقت حلا أفضل لهذه المشكلة بناء على الإجابة أعلاه.
في الفصل
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
في المنشئ
prevTimePicker1 = dateTimePickerStart.Value;
navigatingDateTimePicker = false;
الحدث
private void dateTimePickerStart_ValueChanged(object sender, EventArgs e)
{
if (!navigatingDateTimePicker) {
/* First set the navigating flag to true so this method doesn't get called again while updating */
navigatingDateTimePicker = true;
/* using timespan because that's the only way I know how to round times well */
TimeSpan tempTS = dateTimePickerStart.Value - dateTimePickerStart.Value.Date;
TimeSpan roundedTimeSpan;
if (dateTimePickerStart.Value > prevTimePicker1) {
// round up to the nearest interval
roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Ceiling(tempTS.TotalMinutes / 5));
dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan;
} else {
// round down to the nearest interval from prev
roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor(tempTS.TotalMinutes / 5));
dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan;
}
navigatingDateTimePicker = false;
}
prevTimePicker1 = dateTimePickerStart.Value;
}
يمكنك إضافة هذا الرمز
int minuteDiff = dtpJamAppointmentDokter.Value.Minute - prevTimePicker1.Minute;
if (minuteDiff == 59)
{
dtpJamAppointmentDokter.Value = dtpJamAppointmentDokter.Value.AddHours(-1);
}
قبل
TimeSpan tempTS = dtpJamAppointmentDokter.Value - dtpJamAppointmentDokter.Value.Date;