Microsoft の問題をここに記録しました - Repro はダウンロード可能です: https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used -in-vsto-アドイン
DateTimePicker を Excel VSTO フローティング アドインに配置し、カレンダーがドロップダウンしたときにアドインの端の外側になるように配置する場合は、次を参照してください。
緑の丸で囲まれた日付を選択すると期待どおりに機能しますが、赤で丸で囲まれた日付をクリックすると、カレンダーのドロップダウンが閉じられ、日付が設定されません!
これを修正する方法を知っている人はいますか?
編集
この SO ユーザーは、WPF を使用して問題を経験しました: VSTO WPF ContextMenu.MenuItem TaskPane の外側をクリックして発生しません
その質問への回答は、問題がしばらく前に接続することが報告されたことを示していますが、VSTO 4.0 SP1 ではまだ解決策がありません: https://connect.microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-タスク ペイン-with-wpf-context-menu-has-focus-problems
回避策の 1 つは、DispatcherFrame を使用してメッセージをポンプし、メニューの GotFocusEvent と LostFocusEvent をサブスクライブすることです。http://blogs.msdn.com/b/vsod/archive/2009/12/16/excel-2007-wpf-events-are-not-fired-for-items-that-overlap-excel-ui-for- wpf-context-menus.aspx ですが、これはメニューのすべての WPF コードであり、Winform DateTimePicker のソリューションではありません。
Microsoft Connect の再現:
新しいプロジェクト > Excel 2010 アドイン
using TaskPane;
using Microsoft.Office.Core;
namespace ExcelAddIn2
{
public partial class ThisAddIn
{
TaskPaneView MyTaskView = null;
Microsoft.Office.Tools.CustomTaskPane MyTaskPane = null;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//setup custom taskpane
MyTaskView = new TaskPaneView();
MyTaskView.currentInstance = Globals.ThisAddIn.Application;
MyTaskPane = this.CustomTaskPanes.Add(MyTaskView, "MyTaskView");
MyTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
MyTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
MyTaskPane.Visible = true;
}
}
[ファイル] メニュー > [追加] > [新しいプロジェクト] > [クラス ライブラリ] > 名前付き TaskPane
次に、TaskPane プロジェクトで、TaskPaneView という名前のユーザー コントロールを作成します。
public partial class TaskPaneView : UserControl
{
public TaskPaneView()
{
InitializeComponent();
}
public Microsoft.Office.Interop.Excel.Application currentInstance { get; set; }
public TaskPaneCtrl getTaskPaneCtrl
{
get { return this.taskPaneCtrl1; }
}
}
次に、DateTimePicker を使用してユーザー コントロールを作成し、Calendar コントロールがユーザー コントロールの右下に配置されていることを確認します。
public partial class TaskPaneCtrl : UserControl
{
public TaskPaneCtrl()
{
InitializeComponent();
}
}
TaskPane クラス ライブラリで、Excel Interop を参照します (例: c:\Program Files x86\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll)。
ソリューションをビルドします。機能しない部分をコメントアウトします。ビルド ソリューション。
TaskPaneCtrl を TaskPaneView にドラッグ アンド ドロップし、コンパイルに失敗したもののコメントを外します。
F5 キーを押してカレンダー コントロールをクリックし、タスクペイン領域外の日付を選択してみてください。Value Change イベントは発生しません。カレンダーの外でクリックしたように動作します。
注: コントロールから落ちるドロップダウンリストを試しましたが、そのイベントは発火します!