none
EventHandler 在視窗連續縮小、還原後會失效的問題? RRS feed

  • 問題

  • 請教各位

    為什麼連續縮小再還原From之後,程式內的EventHandler似乎就會失效?

     

    CODE如下:

     

    public Form1()

    {

       InitializeComponent();

        test();

    }

     

    public void test()

    {

       STtest st = new STtest();

       STEvents_Event bc = (STEvents_Event)st.beforeclose;

       bc.add += new STEvents_AddEventHandler(before_close);

    }

     

    void before_close(object jo)

    {

        count += 1;

        //toui(count.ToString(), label2);

    }

     

     

    功能上是正常的,但只要連續縮小再還原Form幾次之後

    before_close就收不到任何東西了..

    還請高手開釋了 ...感謝~



    2011年5月9日 下午 09:42

解答

  • 我剛剛想到你這問題的點了, 因為你在 test() Method 產生st 這個變數, 因此st 變數的生命週期會隨著test() Method, 所以一旦時間到就被回收了.

    所以要宣告在類別全域層級, 至於宣告成static (靜態) 我想應該是非必要的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 tw168 2011年5月10日 上午 07:20
    2011年5月10日 上午 06:25
    版主

所有回覆

  • 可否貼上相關自訂類別的程式碼 ? 因為這樣看不出來.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月10日 上午 01:02
    版主
  • STtest st = new STtest();其實應該不算是自訂類別 (因為是參考元件而來)

    剛剛測試了好久,終於讓我發現解決辦法..

     

    在class後宣告public static STtest st = new STtest();

    問題馬上迎刃而解

     

    只是,我還是不太懂原因... (被GC回收!? 但這與視窗狀態有關係!???)

    還請高手指點迷經了~

    2011年5月10日 上午 03:16
  • 那它是參考什麼來的 ? 又做了些什麼改變 ? 你不願意詳細地說明, 對於想幫你的人是一種困擾, 我建議你先看以下的文章, 了解一下風俗習慣

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/e707eac3-3038-4be8-a925-eaec92a88c5f


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2011年5月10日 上午 03:19
    版主
  • Bill Chung兄,抱歉,似乎引起您的不悅了

    小弟其實不是不願意詳細說明,反倒是因為懂得不多,不知道該如何解釋

     

    STtes(STLib)是參考STtest.exe

    剛剛看了STtest的"定義",如下:

    using System;

    using System.Runtime.InteropServices;

     

    namespace STLib

    {

        [Guid("47D1DFF3-351F-11D1-BC98-00185F82ADAC")]

        [TypeLibType(2)]

        [ClassInterface(0)]

        public class STClass : STevn

        {

            public STClass();

    ...

    ...//省略

            [DispId(5)]

            public virtual object beforeclose { get; }

        }

    }

    不知道是不是您說的東西..

    不過,可以確定是...小弟會找時間多K書、爬文的

    再次對您說聲抱歉 Orz

    2011年5月10日 上午 03:39
  • 我沒有不悅, 我只是希望你能將問題的線索提供出來, 這樣對於重建問題是有幫助的.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月10日 上午 03:43
    版主
  • 有一種方式可以讓自訂類別的生命週期跟著Form.

    類似以下這篇的說明: http://www.dotblogs.com.tw/billchung/archive/2011/01/09/20673.aspx

    重點:

    (1) 自訂類別要繼承 System.ComponentModel.Component

    (2) 要有一個可以加入上層Container的建構函式

    Public Class myClass
        Inherits System.ComponentModel.Component
        
        Sub New(ByVal container As System.ComponentModel.IContainer)
            container.Add(Me)
        End Sub


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月10日 上午 03:58
    版主
  • 我剛剛想到你這問題的點了, 因為你在 test() Method 產生st 這個變數, 因此st 變數的生命週期會隨著test() Method, 所以一旦時間到就被回收了.

    所以要宣告在類別全域層級, 至於宣告成static (靜態) 我想應該是非必要的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 tw168 2011年5月10日 上午 07:20
    2011年5月10日 上午 06:25
    版主
  • 感謝您~上面的資料小弟會慢慢吸收

    ( 不過說真的,可能因為程度差,看得有夠吃力  >"<  )

     

    2011年5月10日 上午 07:20
  • 我倒覺得你會問這樣的問題對程式碼有一定的觀察敏銳度, 可能只是剛接觸, 給你一個建議, 你可以先看MSDN文件的

    [C# 程式設計手冊] 與 [C# 參考]

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月10日 上午 08:59
    版主