[英]ExcelDNA C# Chart.MouseDown event firing only once
每次我在打開的工作簿的每個工作表上單擊圖表時,我都會嘗試處理該事件。 我正在使用這樣的 SheetActivate 事件:
private static void Xlapp_SheetActivate(Object obj_Ws)
{
myCharts.SetAllCharts((XL.Worksheet)obj_Ws);
}
每次激活工作表時調用一個方法,然后在“MyCharts”class 中調用“SetAllCharts”方法,如下所示:
internal void SetAllCharts(object obj_Ws)
{
XL.Worksheet Ws = (XL.Worksheet)obj_Ws;
XL.ChartObjects ChObj = Ws.ChartObjects();
if (ChObj.Count > 0)
{
xlapp.StatusBar = ("Setting " + ChObj.Count + " charts");
foreach (XL.ChartObject obj_Chart in ChObj)
{
XL.Chart myChart = obj_Chart.Chart;
myChart.MouseDown += myChart_MouseDown;
}
}
}
目前,方法處理程序(只是報告單擊的 X 和 Y 的xlapp.StatusBar
消息)工作......只有一次,當我第一次激活工作表時,在第一次單擊圖表時。 之后我不再收到消息框了......我做錯了什么?
您必須小心設置事件處理程序的 COM 對象(或至少圍繞它們的神奇 .NET 包裝器)的生命周期。 它們可能會在您枚舉一個集合並在不久之后收集垃圾時動態創建,從而在此過程中丟失您的事件處理程序。 這就是它工作一次或幾次的原因。
在開始考慮如何編寫代碼之前,對此的測試是將對象保留在更高的 object 級別或全局列表中。 在您的代碼中,這將是您正在枚舉的obj_Chart
object。 只要確保這些對象都保持活動狀態。
(我覺得這東西有點令人困惑,因為 WPF 會發生相反的情況——我認為事件處理程序會阻止垃圾收集?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.