【问题标题】:C# WinForms: Cannot access a dispose objectC# WinForms:无法访问 dispose 对象
【发布时间】:2012-11-04 14:04:24
【问题描述】:

我有一个数据网格视图。此 datagridview 具有自定义 datagridview 列以及其他类似 datagridviewtextbox 列。第三方控件托管在每个单元中。因此,在设计 datagridview 时,在自定义单元格上,除非您处于单元格的编辑模式,否则无法显示内容。因此,为了实现要显示的单元格内容,我重写了paint方法,以便在单元格不处于编辑模式时对其进行绘制。要在单元格中绘制的图像是在paint方法中获得的,我使用如下块:

using (Bitmap bitmap = new Bitmap())
{
   ...
}

另外,为了在 Windows 窗体 datagridview 单元格中托管一个控件,我有一个实现 IDataGridViewEditingControl 的类。

public class a : third-party-component, IDataGridViewEditingControl
{
}

在应用程序的某个时刻,它崩溃说无法访问已处置的对象。 在代码中我没有对任何对象进行任何处理,所以我不明白这一点。

从堆栈看来,错误似乎是在上面指出的类中引发的,但它没有明确指出在哪里。

我确信这是由托管在 Windows 窗体 datagridview 单元格中的控件引起的。关于可能是什么问题的任何想法?

或者它可能与datagridviewtextboxcolumns有关?以下错误:

Cannot access a disposed object.
Object name: 'DataGridViewTextBoxEditingControl'.
Stack Trace:
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.TextBoxBase.CreateHandle()
   at System.Windows.Forms.Control.get_Handle()
   at System.Windows.Forms.Control.GetSafeHandle(IWin32Window window)
   at System.Windows.Forms.ToolTip.Hide(IWin32Window win)
   at System.Windows.Forms.ToolTip.HideAllToolTips()
   at System.Windows.Forms.ToolTip.BaseFormDeactivate(Object sender, EventArgs e)
   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnDeactivate(EventArgs e)
   at Crownwood.DotNetMagic.Forms.WindowChrome.OnDeactivate(EventArgs e)
   at System.Windows.Forms.Form.set_Active(Boolean value)
   at System.Windows.Forms.Form.WmActivate(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at Crownwood.DotNetMagic.Forms.WindowChrome.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

【问题讨论】:

    标签: datagridview datagridviewcolumn objectdisposedexception


    【解决方案1】:

    您似乎尚未处理为工具提示创建的对象。确保您已在相应控件的 (IDataGridViewEditingControl) 的 dispose 方法中释放了 ToolTip 的创建对象。

    protected override void Dispose(bool disposing) { if (disposing) { if (Tip != null) { Tip.Active = false; Tip.Dispose(); Tip = null; } } base.Dispose(disposing); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多