对象在DataGrid上处理异常

时间:2012-12-05 14:53:46

标签: c# datagrid compact-framework dispose

我有一个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);
}

2 个答案:

答案 0 :(得分:1)

Form(或实际上任何Control)处理它的子控件。所以你所看到的是正常的。

要实现您想要的功能,您需要在处理之前从Form的Controls集合中删除DataGrid。

<强>更新

正如@ctacke在评论中所说,几乎可以肯定的替代方案可以避免你需要使DataGrid静态,但没有更多细节,很难提出建议。

答案 1 :(得分:0)

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

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

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 - 或者您会发现自己拥有这些对象同样的错误再次出现。