0

VisualStudio2010のC-SharpのMonthCalendarコントロールのDateChangedイベント内から日付を太字にしています。

前月/翌月をクリックして月を変更すると、ビープ音が鳴ります。ただし、すべてが機能します。

ビープ音を回避/スケルチするにはどうすればよいですか?

問題は非常に簡単に再現できます。

  1. 新しいダミーのWinFormプロジェクトを作成します
  2. MonthCalendarコントロールをフォームに追加します
  3. DateChangedイベントを追加します
  4. DateChangedイベント内に、次のコードを追加します。

    DateTime[] dteBolded = { new DateTime(2012, 9, 28, 0, 0, 0), new DateTime(2012, 9, 21, 0, 0, 0) };
    
    this.monthCalendar1.RemoveAllBoldedDates();
    this.monthCalendar1.BoldedDates = dteBolded;
    
  5. 実行し、VS2010内で再生を押します。

  6. 前月/来月をクリックします。ビープ音が聞こえます。

どうすれば問題を解決できますか?

前もって感謝します、

サラ

4

1 に答える 1

2

BoldedDatesプロパティは特別です。このサポートは、ネイティブWindowsコントロールの作成時に指定されるスタイルフラグ(MCS_DAYSTATE)でオンになります。コードによってプロパティが変更され、ネイティブコントロールウィンドウが強制的に再作成されます。それを確認する1つの明白な方法があります、あなたはそれがかなり顕著にちらつくのを見るでしょう。

ビープ音は、入力イベントを取得する新しいコントロールであるために生成されます。混乱してビープ音が鳴ります。

回避策は、入力処理が完了するようにプロパティの変更を遅らせることです。これは、Control.BeginInvoke()メソッドを使用してエレガントに実行できます。このような:

    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
        this.BeginInvoke(new Action(() => {
            DateTime[] dteBolded = { new DateTime(2012, 9, 28, 0, 0, 0), new DateTime(2012, 9, 21, 0, 0, 0) };

            this.monthCalendar1.RemoveAllBoldedDates();
            this.monthCalendar1.BoldedDates = dteBolded;
        }));
    }
于 2012-07-11T17:56:43.383 に答える