這幾天做項目時,遇到了這一問題:
...
frmSendSMS sms = (frmSendSMS)this.Owner;
sms.listView1.Items.Add(num);
...
報“未將對象引用設置到對象的實例”錯.我在網上搜了一下,終於找到問題的癥結了.最後結合MSDN整理如下(網絡真是個好東西,資料浩瀚.):
注:主要涉及到ShowDialog()方法,有一可選參數owner.
Form.ShowDialog()方法 (IWin32Window)
將窗體顯示爲具有指定所有者的模式對話框。
命名空間:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
語法
Visual Basic(聲明) |
---|
Public Function ShowDialog ( _ owner As IWin32Window _ ) As DialogResult |
Visual Basic(用法) |
---|
Dim instance As Form Dim owner As IWin32Window Dim returnValue As DialogResult returnValue = instance.ShowDialog(owner) |
C# |
---|
public DialogResult ShowDialog ( IWin32Window owner ) |
C++ |
---|
public: DialogResult ShowDialog ( IWin32Window^ owner ) |
J# |
---|
public DialogResult ShowDialog ( IWin32Window owner ) |
JScript |
---|
public function ShowDialog ( owner : IWin32Window ) : DialogResult |
參數
- owner
-
任何實現 IWin32Window(表示將擁有模式對話框的頂級窗口)的對象。
返回值
DialogResult 值之一。異常
異常類型 | 條件 |
---|---|
ArgumentException |
owner 參數中指定的窗體就是顯示的窗體。 |
InvalidOperationException |
要顯示的窗體已經可見。 - 或 - 所顯示窗體被禁用。 - 或 - 顯示的窗體不是頂級窗口。 - 或 - 顯示爲對話框的窗體已經是模式窗體。 |
InvalidOperationException |
當前進程不是以用戶交互模式運行。有關更多信息,請參見 UserInteractive。 |
備註
可以使用此方法在應用程序中顯示模式對話框。調用此方法時,直到關閉對話框後,才執行此方法後面的代碼。可以將 DialogResult 值之一分配給對話框,方法是將該值分配給窗體上 Button 的 DialogResult 屬性或通過使用代碼設置窗體的 DialogResult 屬性。此方法隨後返回該值。可以使用此返回值確定如何處理對話框中發生的操作。例如,如果關閉了對話框,並通過此方法返回了 DialogResult.Cancel 值,則可防止執行在調用 ShowDialog 之後的代碼。
當窗體顯示爲模式對話框時,單擊“關閉”按鈕(窗體右上角帶 X 的按鈕)會隱藏窗體並將 DialogResult 屬性設置爲 DialogResult.Cancel。與無模式窗體不同,當用戶單擊對話框的關閉窗體按鈕或設置 DialogResult 屬性的值時,.NET Framework 不調用 Close 方法。窗體轉而可以隱藏並可重新顯示,而不用創建該對話框的新實例。因爲未關閉顯示爲對話框的窗體,所以在您的應用程序不再需要該窗體時,必須調用該窗體的 Dispose 方法。
ShowDialog 方法的此版本使您得以指定將擁有所顯示的對話框的特定窗體或控件。如果使用此方法的沒有參數的版本,則顯示的對話框將自動歸應用程序的當前活動窗口所有。