C# DataGrid上的对象处理异常

C# DataGrid上的对象处理异常,c#,datagrid,compact-framework,dispose,C#,Datagrid,Compact Framework,Dispose,我有一个DataGrid,出于某种原因,我必须声明它是全局的。第一次使用时,一切似乎都很好。但是,当我返回表单进行另一次尝试时,会调用一个对象处理的异常。我有没有办法阻止这一切?比如处理公共数据网格之类的?以下是我的代码示例: public static DataGrid dataGrid = new DataGrid(); public myForm() { InitializeComponent(); dataGrid.Location = pt; dataGrid.Font.Name

我有一个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之前将其从表单的控件集合中移除

更新


正如@ctacke在评论中所说,几乎可以肯定的是,有一些替代方案可以避免您需要将
数据网格
设置为静态,但如果没有更多细节,就很难提出建议。

如果您要使用静态控件,至少要为其提供一个包装器,以便您能够捕获并处理您的问题

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

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\u CurrentCellChanged
事件处理程序(以及程序中的所有其他内容)引用此公共
DataGrid1
对象,而不是
dataGrid
——否则您会发现自己再次出现同样的错误。

提供您试图实现的目标的更多详细信息?从哪里获得异常?异常发生在dataGrid上。Location=pt。如果我第二次使用该表单,则会发生这种情况。这是因为,在释放该表单时,您的表单将释放其组件中的任何内容,因为您正在将其添加到此.controls列表中,因此在释放该表单后,您可能无法使用它。我的建议。。不要使用静态DataGrid谢谢你的建议。但是,让我克服这个错误的是,每次初始化表单时都重新创建dataGrid。我不确定这是否安全。因此,不是公共静态DataGrid DataGrid=new DataGrid();我只是把公共静态DataGrid放到DataGrid;在初始化中,我将dataGrid=newdatagrid()@jeraldov-这当然可以,但要使DataGrid成为静态的(“出于某种原因,我必须声明为全局的”)。这是因为我有一个类检查DataGrid的内容并更改行颜色。然后你应该将DataGrid实例传递给该类,而不是将其作为“全局的”..或对DataGrid进行子类化以添加所需的行为。