【问题标题】:object disposed exception on DataGridDataGrid 上的对象处理异常
【发布时间】:2012-12-05 14:53:46
【问题描述】:

我有一个 DataGrid,出于某种原因,我必须将其声明为全局。在第一次使用时,一切似乎都运行良好。但是当我返回表单进行另一次尝试时,会调用对象处理异常。无论如何我可以防止这种情况发生吗?像处理公共数据网格什么的?这是我的代码示例:

public static DataGrid dataGrid = new DataGrid();
public myForm()  
{
InitializeComponent();
dataGrid.Location = pt;
dataGrid.Font.Name = "Tahoma";
dataGrid.Font.Size = 9;
dataGrid.BackgroundColor = Color.Azure;
dataGrid.GridLineColor = Color.Black;
dataGrid.ColumnHeadersVisible = false;
dataGrid.RowHeadersVisible = false;
dataGrid.PreferredRowHeight = 60;
this.Controls.Add(dataGrid);
dataGrid.Height = 524;
dataGrid.Width = 468;
dataGrid.CurrentCellChanged += new
EventHandler(dataGrid_CurrentCellChanged);
}

【问题讨论】:

  • 提供更多关于您想要实现的目标的详细信息?
  • 你从哪里得到异常?
  • 异常发生在dataGrid.Location = pt。如果我第二次使用该表格,就会发生这种情况。
  • 那是因为,当你的表单被释放时,你的表单会释放其组件中的任何东西,因为你将它添加到 this.controls 列表中,你可能无法在表单被释放后使用它.我的建议.. 不要使用静态数据网格

标签: c# datagrid compact-framework dispose


【解决方案1】:

Form(或实际上是任何Control)在释放时释放其子控件。所以你看到的是正常的。

要实现您想要的,您需要在释放之前从 Form 的 Controls 集合中删除 DataGrid。

更新

正如@ctacke 在 cmets 中所说,几乎可以肯定有替代方案可以避免您将 DataGrid 设为静态,但如果没有更多细节,很难做出推荐。

【讨论】:

  • 感谢您的建议。但是让我克服这个错误的原因是在表单中的每个初始化都重新创建 dataGrid。我不确定这是否安全。所以不是 public static DataGrid dataGrid = new DataGrid();我只是把 public static DataGrid dataGrid;在初始化里面我把 dataGrid = new DataGrid();
  • @jeraldov - 当然可以,但想让你的 DataGrid 静态化似乎很奇怪(“......出于某种原因,我必须声明为全局”)。跨度>
  • 它是因为我有一个类可以检查我的数据网格的内容并更改行颜色。
  • 那么您应该将 DataGrid 实例传递给该类,而不是将其作为“全局”。
  • ...或子类化 DataGrid 以添加您想要的行为。
【解决方案2】:

如果您要拥有一个静态控件,至少要为其提供一个包装器,以便您可以捕获并处理您的问题。

考虑将您的代码修改为如下所示。一旦你解决了你的错误,你就可以消除任何你不需要的东西。

private static DataGrid dataGrid;
private static myForm myInstance;

public myForm()  
{
  InitializeComponent();
  myInstance = this; // set 'myInstance' before DataGrid1 stuff
  DataGrid1.Height = 524;
  DataGrid1.Width = 468;
  DataGrid1.CurrentCellChanged += new EventHandler(dataGrid_CurrentCellChanged);
}

public static DataGrid DataGrid1 {
  get {
    try {
      if ((myInstance == null) || myInstance.IsDisposed) {
        throw new Exception("myForm is already disposed. No controls available.");
      }
      if ((dataGrid == null) || dataGrid.IsDisposed) {
        dataGrid = new DataGrid();
        dataGrid.Location = pt;
        dataGrid.Font.Name = "Tahoma";
        dataGrid.Font.Size = 9;
        dataGrid.BackgroundColor = Color.Azure;
        dataGrid.GridLineColor = Color.Black;
        dataGrid.ColumnHeadersVisible = false;
        dataGrid.RowHeadersVisible = false;
        dataGrid.PreferredRowHeight = 60;
        this.Controls.Add(dataGrid);
      }
    } catch (Exception err) {
      Console.WriteLine(err); // put a breakpoint HERE
    }
    return dataGrid;
  }
  set {
    try {
      if ((myInstance == null) || myInstance.IsDisposed) {
        throw new Exception("myForm is already disposed. No controls available.");
      }
      if ((dataGrid == null) || dataGrid.IsDisposed) {
        dataGrid = new DataGrid();
        dataGrid.Location = pt;
        dataGrid.Font.Name = "Tahoma";
        dataGrid.Font.Size = 9;
        dataGrid.BackgroundColor = Color.Azure;
        dataGrid.GridLineColor = Color.Black;
        dataGrid.ColumnHeadersVisible = false;
        dataGrid.RowHeadersVisible = false;
        dataGrid.PreferredRowHeight = 60;
        this.Controls.Add(dataGrid);
      }
    } catch (Exception err) {
      Console.WriteLine(err); // put a breakpoint HERE
    }
    dataGrid = value;
  }
}

最后,确保您的 dataGrid_CurrentCellChanged 事件处理程序(以及您程序中的所有其他内容)引用此公共 DataGrid1 对象,而不是 dataGrid - 否则您会发现自己再次遇到相同的错误。

【讨论】:

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