1

嘿嘿,

我的应用程序中有一个标准的 WinForms MonthCalendar,其处理程序连接到 DateChanged 事件。每当我按天更改日期时,单击小日历中的某个日期,事件就会触发一次。但是,每当我按月更改日期时,单击控件中的 < 和 >,事件就会触发两次。我希望事件在所有情况下都触发一次。

有任何想法吗?

编辑:我调试并发现 SelectedItem 或 Range 在第一个和第二个处理程序调用中是相同的。所以我需要一种方法来区分第一次和第二次调用,同时在事件只触发一次时仍然允许正确处理。

请求了处理程序代码,在这里,但它与多次触发的事件无关:

List<TimestampInfo> displayTimestamps = databaseManger.QueryForTimestamps(DayPicker.SelectionRange);
if (displayTimestamps == null) return;
TimestampsListBox.Items.Clear();
TimestampsListBox.Items.AddRange(displayTimestamps.ToArray());
4

3 回答 3

1

有点hack,但是将SelectionRange字符串值与最后一个DataChanged事件进行比较。如果它不同,只需运行您的代码:

private string _LastRange = string.Empty;

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
  if (monthCalendar1.SelectionRange.ToString() != _LastRange) {
    _LastRange = monthCalendar1.SelectionRange.ToString();

    List<TimestampInfo> displayTimestamps = databaseManger.QueryForTimestamps(DayPicker.SelectionRange);
    if (displayTimestamps == null) return;
    TimestampsListBox.Items.Clear();
    TimestampsListBox.Items.AddRange(displayTimestamps.ToArray());
  }
}
于 2011-12-22T17:20:58.030 回答
0

在我连接事件处理程序两次之前,我无法重现这一点。

monthCalendar1.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);
monthCalendar1.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);

您是否使用事件处理程序编写代码?

于 2011-12-22T17:13:03.440 回答
0

试试这个:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
      Calendar1.SelectedDate = Calendar1.VisibleDate;
      //  any additional code optional
}
于 2014-08-10T04:09:43.390 回答