none
關於event的怪問題 RRS feed

  • 問題

  • 我遇到了一個  奇怪的問題
    我試著 描述一下 請大家幫幫忙
    程式架構 是  有一個 MDI Form 會去接 股票行情資料  所以會有一個 event

    g_push.DataReceivedObj += new gPush.DataReceivedObjHandler(QuoteArriveWorking);

    g_push 是我們的報價元件

    #region "報價事件"

            private void QuoteArriveWorking(int ObjNo, object obj)
            {
                try
                {
                        if (!(ReceiveQuoteData == null))
                            ReceiveQuoteData(ObjNo, obj);
                      ....
                }
          }
    而其中的  ReceiveQuoteData
    就是在 MDI 這一層宣告了
            public  delegate  void ReceiveQuoteDataHandler(int ObjNo, Object obj);
            public  event ReceiveQuoteDataHandler ReceiveQuoteData;
    讓其它的子Form 來註冊

    接下來我開了一個MDI的子form
    裡面在 form load 是這樣寫
    //註冊 外層Quote Srv
                    ((FrmMain)ParentForm).ReceiveQuoteData += new FrmMain.ReceiveQuoteDataHandler(QuoteArriveWorking_M);

    在form closing 時這樣寫
    //註冊 外層Quote Srv
                    ((FrmMain)ParentForm).ReceiveQuoteData -= new FrmMain.ReceiveQuoteDataHandler(QuoteArriveWorking_M);

    現在 怪異現像發生了 
    最外層的 QuoteArriveWorking 就變成沒作用了
    就不接資料了  我把反 -= 拿調  有時就變得可以
    但  這樣 原來的 form 就一直出現 Exception  且 資料有時還是不會進來
    幫幫忙吧
    希望有緣人看得懂  我盡力了


    2010年3月2日 上午 09:02

解答

  • 你想的會不會太複雜了一點.
    基本上你只要在ChildForm 開啟時向 Parent Form 註冊有這個Child Form就好了啊
    以下是個簡單的Case (VB.NET)
    Form2 (Child)---裡面只有一個TextBox
    Form1 (Parent)--裡面有一個ToolStrip, 上面有兩個ToolStripButton, (1)負責產生Child Form (2) 模擬你說接收資料的事件, 也就是這個Button按下去就會改變Child Form的TextBox的值

    基本上Form2中我沒特別寫Code
    只看Form1 (Parent)
    Public Class Form1
        Private myArrayList As New ArrayList <--產生一個ArrayList執行個體來存看有多少Child Form

        Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
            Dim xForm As New Form2
            xForm.MdiParent = Me
            myArrayList.Add(xForm)
            xForm.Show()
        End Sub

        Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click
            For Each obj As Object In myArrayList
                CType(obj, Form2).TextBox1.Text = Now().ToString()
            Next
        End Sub
    End Class




    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已提議為解答 Alex_Lee 2010年3月2日 下午 04:46
    • 已標示為解答 布利 2010年3月3日 上午 11:21
    2010年3月2日 下午 03:58
    版主
  • Hi,

    若你的子視窗都一定要註冊
    那用MdiChildren去找尋所有叫起的子視窗
    並做對應的處理就好

    Form.MdiChildren Property
    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.mdichildren.aspx
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 布利 2010年3月3日 上午 11:21
    2010年3月3日 上午 04:32

所有回覆

  • 你的QuoteArriveWorking是要在MainFrom 作接收
    就在MainForm OnLoad事件 處理 就好了
    為何要透過child form?

    2010年3月2日 上午 09:23
  • 你的QuoteArriveWorking是要在MainFrom 作接收
    就在MainForm OnLoad事件 處理 就好了
    為何要透過child form?


    Child Form 是要去拿  MDI Form 的資料
    我程式的意思就是當  MDI Form 接到資料時
    會傳給  有註冊的  子Form
    子form 註冊方式就是 
    ((FrmMain)ParentForm).ReceiveQuoteData += new FrmMain.ReceiveQuoteDataHandler(QuoteArriveWorking_M);

    但我將此子form 關閉時 會先 
    ((FrmMain)ParentForm).ReceiveQuoteData -= new FrmMain.ReceiveQuoteDataHandler(QuoteArriveWorking_M);

    結果 造成外面的 QuoteArriveWorking  都不作用了
    2010年3月2日 上午 09:33
  • Hi,

    你所謂的QuoteArriveWorking不作用是怎樣的情形?
    是子視窗沒收到資料?
    還是主視窗的QuoteArriveWorking也都不會進去?
    你要不要Debug確認一下
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月2日 上午 09:59
  • Hi,

    你所謂的QuoteArriveWorking不作用是怎樣的情形?
    是子視窗沒收到資料?
    還是主視窗的QuoteArriveWorking也都不會進去?
    你要不要Debug確認一下
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    謝謝您的回應
    我的狀況是連  主視窗的QuoteArriveWorking也都不會進去

    所以我懷疑是否  我註冊event 跟 反註冊event 會不會 寫不對 唉  好煩
    2010年3月2日 上午 11:35
  • 那我把問題  簡化成一個需求  請各位幫忙想想這樣架構要如何去實作

    就是我 MDI Form 會去統一接收外部的資料 也會去註冊event 收到資料後 MDI 這一層就會有一份資料了

    相對的  若我開其中的子視窗  想要這些資料  就要去跟  外部MDI form 註冊其 event

    這樣的架構  主要就是 讓資料連線一份  大家都可以用  然後用event 的方式去 push 給子視窗

    是否有人可以  大概寫個  sample code  因為 我在第一篇 寫得怕表達不清楚

    我想還是從架構面去著手  請大家幫幫我吧
    2010年3月2日 下午 03:38
  • 你想的會不會太複雜了一點.
    基本上你只要在ChildForm 開啟時向 Parent Form 註冊有這個Child Form就好了啊
    以下是個簡單的Case (VB.NET)
    Form2 (Child)---裡面只有一個TextBox
    Form1 (Parent)--裡面有一個ToolStrip, 上面有兩個ToolStripButton, (1)負責產生Child Form (2) 模擬你說接收資料的事件, 也就是這個Button按下去就會改變Child Form的TextBox的值

    基本上Form2中我沒特別寫Code
    只看Form1 (Parent)
    Public Class Form1
        Private myArrayList As New ArrayList <--產生一個ArrayList執行個體來存看有多少Child Form

        Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
            Dim xForm As New Form2
            xForm.MdiParent = Me
            myArrayList.Add(xForm)
            xForm.Show()
        End Sub

        Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click
            For Each obj As Object In myArrayList
                CType(obj, Form2).TextBox1.Text = Now().ToString()
            Next
        End Sub
    End Class




    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已提議為解答 Alex_Lee 2010年3月2日 下午 04:46
    • 已標示為解答 布利 2010年3月3日 上午 11:21
    2010年3月2日 下午 03:58
    版主
  • Hi,

    若你的子視窗都一定要註冊
    那用MdiChildren去找尋所有叫起的子視窗
    並做對應的處理就好

    Form.MdiChildren Property
    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.mdichildren.aspx
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 布利 2010年3月3日 上午 11:21
    2010年3月3日 上午 04:32