WinForm-用戶控件的初始化順序問題

WinForm-用戶控件的初始化順序問題

    
最近由於興趣寫了一個用戶控件ColorfulTextBox,當鼠標進入或移出該控件時會自變換邊框顏色,比起System.Windows.Forms.TextBox好看多了。但是,卻發現一個問題。雖然在控件中定義了UserControl中的SizeChanged和Resize事件的響應方法,並調整大小。但是,在引用該控件的窗體上(即設計階段)無論怎麼修改UserControl的Size屬性,運行的時候都顯示的是原始大小。即,效果跟在設計階段沒有調整Size屬性一樣。爲什麼會出現這個問題呢?原來與控件和引用窗體的初始化順序有關。

    在UserControl與其引用窗體的InitialComponent方法、構造方法、Load事件都加上了MessageBox.Show方法,這才發現控件與窗體的初始化順序並不像自己想象的那樣:

    最初以爲的順序:    |   UerControl.InitialComponent -->     |

                        |   UerControl.構造方法 -->             |

                        |   UerControl.Load -->                 |

                        |   引用窗體.InitialComponent -->       |

                        |   引用窗體.構造方法 -->               |

                        |   引用窗體.Load                       |

   實際正確的順序:    |   UerControl.InitialComponent -->     |

                        |   UerControl.構造方法 -->             |

                        |   引用窗體.InitialComponent -->       |

                        |   引用窗體.構造方法 -->               |

                        |   UerControl.Load -->                 |

                        |   引用窗體.Load                       |

   

    我寫的那些Resize和SizeChanged事件是放在UserControl.Load中的,在設計階段對UserControl的Size所做的調整並沒有被這些事件所捕獲,因爲窗體設計階段的代碼在引用窗體的InitialComponent方法中,而這個方法卻在UserControl.Load之前被調用。

總結

    自定義控件的初始化應該放在其構造方法中,而不是放在Load事件對應的處理程序中。

    從窗體設計器自動生成的代碼可以看出,窗體或控件的InitialComponent是放在其構造方法中的,而這些代碼是窗體設計器自動生成的,裏面包括許多控件變量的聲明等的,所以,我們應該把InitialComponent這些代碼放在構造方法的最前面。即,我們對窗體或控件的初始化應該放在構造方法中、InitialComponent方法的後面。 

       public ColorfulBorderTextBox()
        {
            InitializeComponent();//這是窗體設計器自動生成的代碼

 

            //這裏是你自己的代碼,以進行一些必要的初始化///////////
            Initialize();   //設置屬性默認值,進行一些初始化//////
            EventHandling();//設置事件監聽程序////////////////////

            ///////////////////////////////////////////////////////

        } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章