• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 17,  comments - 2,  trackbacks - 0

            Form問題是最基本的問題,因為編寫WinApp程序首先接觸的對象就是它,因此在論壇中對它而產生的問題也最常見。

             

            Form相關的常見問題大致分為如下的四類問題。

            第一類問題:如何控制窗體的顯示順序;

            第二類問題:窗體之間的對象如何相互引用或操作;

            第三類問題:如何處理窗體唯一性問題;

            最后一個問題:如何合理的關閉窗體或程序。

             

            接下來先說說如何控制窗體的顯示順序。

            很多編程者常常會遇到這樣的現象,例如,通過一個登錄窗體去打開一個主窗體,然后要在主窗體中想關閉這個登錄窗體。那么就有人出主意,你可以在打開主窗體的時候把登錄窗體自身傳進去,然后在主窗體中調用它的Hide方法來隱藏。雖說這樣可以暫時達到你所要的效果,但不是最合理的解決辦法。因為這樣做有如下兩個缺陷。

            第一個就是,登錄窗體已經完成使命,而資源沒有得到及時釋放;

            其次就是,在窗體關閉的時候比較麻煩,需要找到登錄窗口,關閉自身的同時要關閉登錄窗體。

             

            遇到此問題的時候,首要的是分析窗體打開的順序以及相互關聯的條件,常見的類型無非就是主子或者先后這兩種。理解好第一點后,那么要學會合理使用ShowDialogDialogResult這兩個好東西,前者屬于模式打開窗體,后者屬于窗體的返回值。

             

            明白了這兩點,就可以很方便的解決類似于登錄窗體的問題,這方面的例子可以參看我的這篇文章。

            http://blog.csdn.net/knight94/archive/2006/04/06/652394.aspx

            文章中修改了一個WinApp的入口函數Main,那么并不意味著這個方法只能在這兒使用,它可以在很多方法中進行使用,基本語法類似,這里我就不多說了。

             

            第二個要說的是窗體之間的對象如何相互引用或者操作。

            常見的類似問題有:

            1. 如何在子窗體訪問到主窗體中的某某數據;

            2. 如何在子窗體中調用主窗體中的某某方法;

            3. 如何在子窗體關閉的時候去更新主窗體的某某數據;

             

            對于如上的三個問題,完全可以由如下兩種方法來完成。

            1. 當數據是子窗體顯示的必要條件的話,通過修改子窗體的構造函數來進行傳遞數據;

            2. 如果是不定時的訪問,則可以通過委托來實現。

             

            對于第一點,我就不多說了,對于第二點,我用如下的例子來說明。

            首先在子窗體中,需要如下:

                //Define two delegate methods to get or set textbox value in main form

                public delegate void SetTextValue( string TextValue );

                public delegate string GetTextValue(  );

                // In sub-form class

                // Handler for methods from main form

                private SetTextValue SetText = null;

                private GetTextValue GetText = null;

             

                // Call methods as follows

                string strValue = GetText();

                SetText( strValue + DateTime.Now.ToString() );

             

            除了如上一些操作外,還需要修改子窗體的構造函數,來接收這兩個delegate方法,這里就不多說了。

             

            至于主窗體,首先要為這兩個委托來實現對應函數,例如:

                /// <summary>

                /// Get textbox's text for other forms

                /// </summary>

                /// <returns></returns>

                private string GetValue()

                {

                    return yourTextBox.Text;

                }

             

                /// <summary>

                /// Set textbox's text for other forms

                /// </summary>

                /// <param name="sValue"></param>

                private void SetValue( string sValue )

                {

                    yourTextBox.Text = sValue;

                }

             

            那么調用子窗體的時候就比較簡單了。

                // Create subform and show it

                yourSubForm myForm = new yourSubForm(

                    new SetTextValue( SetValue ),

                    new GetTextValue( GetValue ) );

                myForm.ShowDialog();

             

            這樣一個通過委托來操縱主窗體的例子就完成了。這里需要注意的一點,如果在子窗體中大量使用到主窗體的數據的話,那我建議你重新考慮窗體架構,這意味著你目前的窗體架構不合理。

             

            有人說了,僅僅為了訪問一個成員就需要勞師動眾編寫委托,多麻煩,直接public成員,或者使用static靜態成員多方便,那么對于這兩點的壞處,我這里就不多說了,參看我的這篇文章你就會明白。

            http://blog.csdn.net/knight94/archive/2006/06/04/772886.aspx

             

            第三類問題,窗體的唯一性問題,這個問題我在這兒就不多說了,因為這類問題我在如下的文章已經說得很透徹了。

            http://blog.csdn.net/knight94/archive/2006/05/24/752783.aspx

             

            最后一個問題,如何合理的關閉窗體和程序。很多人關閉了窗體,發現程序進程還在,就不知道如何來操作了。大多數的問題,都是因為第一類問題而產生的連鎖反應。所以我不建議使用Application.Exit來關閉程序,雖說C#寫的是托管程序,內存的釋放可以不用操心,但是好的編碼習慣,有利于在編寫復雜程序的時候能得心應手。

             

            那么如何正確的關閉一個窗體或者一個程序呢。

             

            如果不能正常關閉的原因是由于第一類問題造成的話,按照第一類的方法去修改窗體顯示順序,來達到合理的步驟。前期的正確,才能保證后期的能通過this.Close進行關閉窗體以及程序。

             

            如果是子窗體要關閉連鎖到主窗體關閉的話,這類問題也占一大部分,那么解決此類問題可以采用第二類問題所提到委托方法。

             

            那么還有一些窗體關閉,程序沒有正常關閉,是由于子線程沒有關閉的問題,這部分留到線程匯總部分再說。

             

            C#寫程序不難,如何編寫正確的程序才是至關重要。此時再回過頭看看前面所說的四類問題的解決方法,其實不難發現這些方法并沒有用到特別深的技術,都是非常普通的方法。俗話說,平凡中見真知,只要把所學的方法正確應用到編碼當中,那么你處理此類問題也能游刃有余。

            posted on 2008-11-02 20:44 BeyondCN 閱讀(200) 評論(0)  編輯 收藏 引用 所屬分類: .NET
            久久夜色精品国产欧美乱| 精品国产VA久久久久久久冰| 久久成人国产精品一区二区| 热RE99久久精品国产66热| 久久一本综合| 久久国产亚洲精品无码| 久久精品视屏| 国产精品99久久精品| 久久精品18| 日韩精品国产自在久久现线拍| 无码人妻久久一区二区三区蜜桃| 久久精品国产亚洲av高清漫画| 久久伊人中文无码| 人人狠狠综合久久亚洲婷婷| 伊人久久大香线焦AV综合影院| 久久96国产精品久久久| 久久久久亚洲精品天堂久久久久久 | 国产成年无码久久久免费| 精品视频久久久久| 久久久久99精品成人片直播| 久久亚洲精品无码观看不卡| 久久99免费视频| 久久99精品久久久久久动态图 | 一本久道久久综合狠狠躁AV| 国产一级持黄大片99久久| 日韩精品久久久久久免费| 亚洲精品无码久久久| 久久精品成人免费观看97| 91亚洲国产成人久久精品| 999久久久免费国产精品播放| 久久综合88熟人妻| 少妇久久久久久久久久| 四虎国产精品成人免费久久| 久久精品国产精品亚洲| 久久亚洲国产精品五月天婷| 国内精品欧美久久精品| 久久久久久亚洲精品无码| 日本欧美国产精品第一页久久| 久久午夜福利电影| 亚洲?V乱码久久精品蜜桃| 亚洲精品国产第一综合99久久|