簡體   English   中英

ExcelDNA C# Chart.MouseDown 事件僅觸發一次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM