这几天做项目时,遇到了这一问题:
...
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 方法的此版本使您得以指定将拥有所显示的对话框的特定窗体或控件。如果使用此方法的没有参数的版本,则显示的对话框将自动归应用程序的当前活动窗口所有。