В моих приложениях windows windows клиенты иногда сообщают о странном исключении:
System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
at System.Windows.Forms.Control.Dispose(Boolean disposing)
at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
at System.ComponentModel.Component.Dispose()
at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)
Код, который вызывает эту ошибку, выглядит следующим образом:
namespace MyCompany.SomeApp
{
public class DialogBox : CustomForm
{
public static DialogResult Show(string caption, string message)
{
using (DialogBox dialog = new DialogBox())
{
dialog.Text = caption;
dialog.lblMessage.Text = message;
return dialog.ShowDialog();
}
}
}
}
DialogBox в основном является классом, который наследуетиз Windows.Forms.Form и вносит некоторые изменения в дизайн, ничего особенного.Исключения происходят в
return dialog.ShowDialog();
, а не в конце блока using
, как я ожидал.Так или иначе, в методе ShowDialog()
и до создания дескриптора формы вызывается метод Dispose ().Но мой DialogBox не вызывает сам Dispose () и не глотает другие исключения, он только рисует некоторые события OnPaint ().
У кого-нибудь есть какие-то подсказки, как избавиться от этого исключения?
Обновление:
Вот единственный код в моем классе CustomForm (кроме режима изменений в конструкторе форм Windows (добавлено 2 ярлыка, кнопка и изменены некоторые цвета)
Public Class CustomForm
Inherits System.Windows.Forms.Form
<DebuggerStepThrough()> _
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Static pen1 As New Pen(Color.FromArgb(39, 46, 54), 21)
Static pen2 As New Pen(Color.FromArgb(44, 51, 59), 1)
Static pen3 As New Pen(Color.FromArgb(93, 99, 99), 1)
Static pen4 As New Pen(Color.FromArgb(119, 124, 127), 1)
Static pen5 As New Pen(Color.FromArgb(148, 157, 156), 1)
Static pen6 As New Pen(Color.FromArgb(175, 185, 186), 1)
With e.Graphics
.DrawRectangle(Pens.Black, 0, 0, (Me.Width - 1), (Me.Height - 1))
.DrawLine(pen1, 1, 11, Me.Width - 1, 11)
.DrawLine(pen2, 1, 22, Me.Width - 2, 22)
.DrawLine(pen3, 1, 23, Me.Width - 2, 23)
.DrawLine(pen4, 1, 24, Me.Width - 2, 24)
.DrawLine(pen5, 1, 25, Me.Width - 2, 25)
.DrawLine(pen6, 1, 26, Me.Width - 2, 26)
End With
End Sub
Private Const GWL_STYLE As Integer = (-16)
Private Const WS_CAPTION As Integer = &HC00000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
Public ReadOnly Property HasCaption() As Boolean
Get
return (GetWindowLong(Me.Handle, GWL_STYLE) And WS_CAPTION) = WS_CAPTION
End Get
End Property
End Class
Обновление:Я немного изменил код, потому что он вводил в заблуждение.
В трассировке стека видно, что вызывается My.App.DialogBox.Show (...). Это статический метод, содержащий блок using.
Ни DialogBox, ни CustomForm не переопределяют метод ShowDialog () формы (именно поэтому он не отображается в трассировке стека.