By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,717 Members | 2,052 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,717 IT Pros & Developers. It's quick & easy.

Closing a Non-Modal Dialog

P: n/a
I get a Null Reference Exception if I close a non-modal dialog (that is, a
form opened with Show()) when a selection is made from a ComboBox. The error
message refers to Unsafe Native Methods, but the code is 100% managed. The
exception is not thrown if the dialog was modal (opened with ShowDialog()) or
if the selection is made from, say, a ListBox.

I have included a simple example below.

I am using C#.NET 2003, Standard Edition.

Thanks,
Andrew.

// sample code

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

namespace Main
{
/// <summary>
/// Summary description for Form1.
/// </summary>
///

public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>

private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private A.FormA A;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//

}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(56, 16);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "open A";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(184, 61);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
A = new A.FormA();
A.Show(); // modeless dialog : callback function crashes when selection
made from ComboBox in form A.
//A.ShowDialog(); // modal case works.
}

}

}

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace A
{
/// <summary>
/// Summary description for FormA.
/// </summary>
public class FormA : System.Windows.Forms.Form
{
private System.Windows.Forms.ComboBox comboBox1;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public FormA()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.Items.AddRange(new object[] {
"1",
"2"});
this.comboBox1.Location = new System.Drawing.Point(88, 16);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(80, 21);
this.comboBox1.TabIndex = 0;
this.comboBox1.Text = "1";
this.comboBox1.SelectedIndexChanged += new
System.EventHandler(this.comboBox1_SelectedIndexCh anged);
//
// FormA
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(232, 61);
this.Controls.Add(this.comboBox1);
this.Name = "FormA";
this.Text = "FormA";
this.ResumeLayout(false);

}
#endregion

private void comboBox1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
this.Close(); // does not work if FormA is a modeless dialog.
//MessageBox.Show(" Closing..."); // has not yet crashed
}

}
}

// *** ERROR MESSAGE ***
/*
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of
an object.
at System.Windows.Forms.UnsafeNativeMethods.CallWindo wProc(IntPtr wndProc,
IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Messa ge& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage (Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(M essage& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase: file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
Dummy2
Assembly Version: 1.0.1794.22479
Win32 Version: 1.0.1794.22479
CodeBase: file:///C:/Source/Dummy2/bin/Release/Dummy2.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------

************** JIT Debugging **************
To enable just in time (JIT) debugging, the config file for this
application or machine (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the machine
rather than being handled by this dialog.
*/

Nov 16 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Looks like a bug in the framework...
You can try the following as a workaround:

* Declare the PostMessage API function with DllImportAttribute
* Declare the WM_CLOSE message constant
* Call PostMessage with the form's handle and WM_CLOSE as the message in the
SelectedIndexChanged.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

"Andrew" <An****@discussions.microsoft.com> wrote in message
news:6B**********************************@microsof t.com...
I get a Null Reference Exception if I close a non-modal dialog (that is, a
form opened with Show()) when a selection is made from a ComboBox. The
error
message refers to Unsafe Native Methods, but the code is 100% managed. The
exception is not thrown if the dialog was modal (opened with ShowDialog())
or
if the selection is made from, say, a ListBox.

I have included a simple example below.

I am using C#.NET 2003, Standard Edition.

Thanks,
Andrew.

// sample code

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

namespace Main
{
/// <summary>
/// Summary description for Form1.
/// </summary>
///

public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>

private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private A.FormA A;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//

}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(56, 16);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "open A";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(184, 61);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
A = new A.FormA();
A.Show(); // modeless dialog : callback function crashes when selection
made from ComboBox in form A.
//A.ShowDialog(); // modal case works.
}

}

}

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace A
{
/// <summary>
/// Summary description for FormA.
/// </summary>
public class FormA : System.Windows.Forms.Form
{
private System.Windows.Forms.ComboBox comboBox1;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public FormA()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.Items.AddRange(new object[] {
"1",
"2"});
this.comboBox1.Location = new System.Drawing.Point(88, 16);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(80, 21);
this.comboBox1.TabIndex = 0;
this.comboBox1.Text = "1";
this.comboBox1.SelectedIndexChanged += new
System.EventHandler(this.comboBox1_SelectedIndexCh anged);
//
// FormA
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(232, 61);
this.Controls.Add(this.comboBox1);
this.Name = "FormA";
this.Text = "FormA";
this.ResumeLayout(false);

}
#endregion

private void comboBox1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
this.Close(); // does not work if FormA is a modeless dialog.
//MessageBox.Show(" Closing..."); // has not yet crashed
}

}
}

// *** ERROR MESSAGE ***
/*
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of
an object.
at System.Windows.Forms.UnsafeNativeMethods.CallWindo wProc(IntPtr wndProc,
IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Messa ge& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage (Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(M essage& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase: file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
Dummy2
Assembly Version: 1.0.1794.22479
Win32 Version: 1.0.1794.22479
CodeBase: file:///C:/Source/Dummy2/bin/Release/Dummy2.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------

************** JIT Debugging **************
To enable just in time (JIT) debugging, the config file for this
application or machine (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the machine
rather than being handled by this dialog.
*/


Nov 16 '05 #2

P: n/a
Thanks, Dmitriy.
I had a look at the documentation Using MessageWindow (Smart Device
Projects) in which
PostMessage appears, but could not understand it because I do not have a
background in Windows API.
I assume that "communication between native Windows applications and managed
applications" is system level
management that the C# programmer should not normally have to deal with when
the code is all managed.
What happens if this is a bug in the framework ? How are bug fixes
distributed ?
Regards,
Andrew.

"Dmitriy Lapshin [C# / .NET MVP]" wrote:
Looks like a bug in the framework...
You can try the following as a workaround:

* Declare the PostMessage API function with DllImportAttribute
* Declare the WM_CLOSE message constant
* Call PostMessage with the form's handle and WM_CLOSE as the message in the
SelectedIndexChanged.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

"Andrew" <An****@discussions.microsoft.com> wrote in message
news:6B**********************************@microsof t.com...
I get a Null Reference Exception if I close a non-modal dialog (that is, a
form opened with Show()) when a selection is made from a ComboBox. The
error
message refers to Unsafe Native Methods, but the code is 100% managed. The
exception is not thrown if the dialog was modal (opened with ShowDialog())
or
if the selection is made from, say, a ListBox.

I have included a simple example below.

I am using C#.NET 2003, Standard Edition.

Thanks,
Andrew.

// sample code

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

namespace Main
{
/// <summary>
/// Summary description for Form1.
/// </summary>
///

public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>

private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private A.FormA A;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//

}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(56, 16);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "open A";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(184, 61);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
A = new A.FormA();
A.Show(); // modeless dialog : callback function crashes when selection
made from ComboBox in form A.
//A.ShowDialog(); // modal case works.
}

}

}

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace A
{
/// <summary>
/// Summary description for FormA.
/// </summary>
public class FormA : System.Windows.Forms.Form
{
private System.Windows.Forms.ComboBox comboBox1;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public FormA()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.Items.AddRange(new object[] {
"1",
"2"});
this.comboBox1.Location = new System.Drawing.Point(88, 16);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(80, 21);
this.comboBox1.TabIndex = 0;
this.comboBox1.Text = "1";
this.comboBox1.SelectedIndexChanged += new
System.EventHandler(this.comboBox1_SelectedIndexCh anged);
//
// FormA
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(232, 61);
this.Controls.Add(this.comboBox1);
this.Name = "FormA";
this.Text = "FormA";
this.ResumeLayout(false);

}
#endregion

private void comboBox1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
this.Close(); // does not work if FormA is a modeless dialog.
//MessageBox.Show(" Closing..."); // has not yet crashed
}

}
}

// *** ERROR MESSAGE ***
/*
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of
an object.
at System.Windows.Forms.UnsafeNativeMethods.CallWindo wProc(IntPtr wndProc,
IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Messa ge& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage (Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(M essage& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase: file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
Dummy2
Assembly Version: 1.0.1794.22479
Win32 Version: 1.0.1794.22479
CodeBase: file:///C:/Source/Dummy2/bin/Release/Dummy2.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------

************** JIT Debugging **************
To enable just in time (JIT) debugging, the config file for this
application or machine (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the machine
rather than being handled by this dialog.
*/


Nov 16 '05 #3

P: n/a
Andrew,
I assume that "communication between native Windows applications and
managed
applications" is system level management that the C# programmer should not
normally have to deal with when the code is all managed.
You are right, but sometimes you have to have system-level workarounds.
What happens if this is a bug in the framework ? How are bug fixes
distributed ?
I am not 100% sure, but looks like this is indeed a bug. There are service
packs for both versions of the Framework, they are available either from
Windows Update or from the Microsoft .NET website.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

"Andrew" <An****@discussions.microsoft.com> wrote in message
news:8D**********************************@microsof t.com... Thanks, Dmitriy.
I had a look at the documentation Using MessageWindow (Smart Device
Projects) in which
PostMessage appears, but could not understand it because I do not have a
background in Windows API.
I assume that "communication between native Windows applications and
managed
applications" is system level
management that the C# programmer should not normally have to deal with
when
the code is all managed.
What happens if this is a bug in the framework ? How are bug fixes
distributed ?
Regards,
Andrew.

"Dmitriy Lapshin [C# / .NET MVP]" wrote:
Looks like a bug in the framework...
You can try the following as a workaround:

* Declare the PostMessage API function with DllImportAttribute
* Declare the WM_CLOSE message constant
* Call PostMessage with the form's handle and WM_CLOSE as the message in
the
SelectedIndexChanged.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

"Andrew" <An****@discussions.microsoft.com> wrote in message
news:6B**********************************@microsof t.com...
>I get a Null Reference Exception if I close a non-modal dialog (that is,
>a
> form opened with Show()) when a selection is made from a ComboBox. The
> error
> message refers to Unsafe Native Methods, but the code is 100% managed.
> The
> exception is not thrown if the dialog was modal (opened with
> ShowDialog())
> or
> if the selection is made from, say, a ListBox.
>
> I have included a simple example below.
>
> I am using C#.NET 2003, Standard Edition.
>
> Thanks,
> Andrew.
>
> // sample code
>
> using System;
> using System.Drawing;
> using System.ComponentModel;
> using System.Windows.Forms;
>
> namespace Main
> {
> /// <summary>
> /// Summary description for Form1.
> /// </summary>
> ///
>
> public class Form1 : System.Windows.Forms.Form
> {
> /// <summary>
> /// Required designer variable.
> /// </summary>
>
> private System.ComponentModel.Container components = null;
> private System.Windows.Forms.Button button1;
> private A.FormA A;
>
> public Form1()
> {
> //
> // Required for Windows Form Designer support
> //
> InitializeComponent();
>
> //
> // TODO: Add any constructor code after InitializeComponent call
> //
>
> }
>
> /// <summary>
> /// Clean up any resources being used.
> /// </summary>
> protected override void Dispose( bool disposing )
> {
> if( disposing )
> {
> if (components != null)
> {
> components.Dispose();
> }
> }
> base.Dispose( disposing );
> }
>
> #region Windows Form Designer generated code
> /// <summary>
> /// Required method for Designer support - do not modify
> /// the contents of this method with the code editor.
> /// </summary>
> private void InitializeComponent()
> {
> this.button1 = new System.Windows.Forms.Button();
> this.SuspendLayout();
> //
> // button1
> //
> this.button1.Location = new System.Drawing.Point(56, 16);
> this.button1.Name = "button1";
> this.button1.TabIndex = 0;
> this.button1.Text = "open A";
> this.button1.Click += new System.EventHandler(this.button1_Click);
> //
> // Form1
> //
> this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
> this.ClientSize = new System.Drawing.Size(184, 61);
> this.Controls.Add(this.button1);
> this.Name = "Form1";
> this.Text = "Form1";
> this.ResumeLayout(false);
>
> }
> #endregion
>
> /// <summary>
> /// The main entry point for the application.
> /// </summary>
> [STAThread]
> static void Main()
> {
> Application.Run(new Form1());
> }
>
> private void button1_Click(object sender, System.EventArgs e)
> {
> A = new A.FormA();
> A.Show(); // modeless dialog : callback function crashes when selection
> made from ComboBox in form A.
> //A.ShowDialog(); // modal case works.
> }
>
> }
>
> }
>
> using System;
> using System.Drawing;
> using System.Collections;
> using System.ComponentModel;
> using System.Windows.Forms;
>
> namespace A
> {
> /// <summary>
> /// Summary description for FormA.
> /// </summary>
> public class FormA : System.Windows.Forms.Form
> {
> private System.Windows.Forms.ComboBox comboBox1;
>
> /// <summary>
> /// Required designer variable.
> /// </summary>
> private System.ComponentModel.Container components = null;
>
> public FormA()
> {
> //
> // Required for Windows Form Designer support
> //
> InitializeComponent();
>
> //
> // TODO: Add any constructor code after InitializeComponent call
> //
> }
>
> /// <summary>
> /// Clean up any resources being used.
> /// </summary>
> protected override void Dispose( bool disposing )
> {
> if( disposing )
> {
> if(components != null)
> {
> components.Dispose();
> }
> }
> base.Dispose( disposing );
> }
>
> #region Windows Form Designer generated code
> /// <summary>
> /// Required method for Designer support - do not modify
> /// the contents of this method with the code editor.
> /// </summary>
> private void InitializeComponent()
> {
> this.comboBox1 = new System.Windows.Forms.ComboBox();
> this.SuspendLayout();
> //
> // comboBox1
> //
> this.comboBox1.Items.AddRange(new object[] {
> "1",
> "2"});
> this.comboBox1.Location = new System.Drawing.Point(88, 16);
> this.comboBox1.Name = "comboBox1";
> this.comboBox1.Size = new System.Drawing.Size(80, 21);
> this.comboBox1.TabIndex = 0;
> this.comboBox1.Text = "1";
> this.comboBox1.SelectedIndexChanged += new
> System.EventHandler(this.comboBox1_SelectedIndexCh anged);
> //
> // FormA
> //
> this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
> this.ClientSize = new System.Drawing.Size(232, 61);
> this.Controls.Add(this.comboBox1);
> this.Name = "FormA";
> this.Text = "FormA";
> this.ResumeLayout(false);
>
> }
> #endregion
>
> private void comboBox1_SelectedIndexChanged(object sender,
> System.EventArgs e)
> {
> this.Close(); // does not work if FormA is a modeless dialog.
> //MessageBox.Show(" Closing..."); // has not yet crashed
> }
>
> }
> }
>
> // *** ERROR MESSAGE ***
> /*
> See the end of this message for details on invoking
> just-in-time (JIT) debugging instead of this dialog box.
>
> ************** Exception Text **************
> System.NullReferenceException: Object reference not set to an instance
> of
> an object.
> at System.Windows.Forms.UnsafeNativeMethods.CallWindo wProc(IntPtr
> wndProc,
> IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
> at System.Windows.Forms.NativeWindow.DefWndProc(Messa ge& m)
> at System.Windows.Forms.Control.DefWndProc(Message& m)
> at System.Windows.Forms.Control.WmCommand(Message& m)
> at System.Windows.Forms.Control.WndProc(Message& m)
> at System.Windows.Forms.ComboBox.WndProc(Message& m)
> at System.Windows.Forms.ControlNativeWindow.OnMessage (Message& m)
> at System.Windows.Forms.ControlNativeWindow.WndProc(M essage& m)
> at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
> IntPtr wparam, IntPtr lparam)
>
>
> ************** Loaded Assemblies **************
> mscorlib
> Assembly Version: 1.0.5000.0
> Win32 Version: 1.1.4322.2032
> CodeBase:
> file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
> ----------------------------------------
> Dummy2
> Assembly Version: 1.0.1794.22479
> Win32 Version: 1.0.1794.22479
> CodeBase: file:///C:/Source/Dummy2/bin/Release/Dummy2.exe
> ----------------------------------------
> System.Windows.Forms
> Assembly Version: 1.0.5000.0
> Win32 Version: 1.1.4322.2032
> CodeBase:
> file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
> ----------------------------------------
> System
> Assembly Version: 1.0.5000.0
> Win32 Version: 1.1.4322.2032
> CodeBase:
> file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
> ----------------------------------------
> System.Drawing
> Assembly Version: 1.0.5000.0
> Win32 Version: 1.1.4322.2032
> CodeBase:
> file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
> ----------------------------------------
>
> ************** JIT Debugging **************
> To enable just in time (JIT) debugging, the config file for this
> application or machine (machine.config) must have the
> jitDebugging value set in the system.windows.forms section.
> The application must also be compiled with debugging
> enabled.
>
> For example:
>
> <configuration>
> <system.windows.forms jitDebugging="true" />
> </configuration>
>
> When JIT debugging is enabled, any unhandled exception
> will be sent to the JIT debugger registered on the machine
> rather than being handled by this dialog.
> */
>



Nov 16 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.