0

何らかの理由でグローバルとして宣言する必要がある 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);
}
4

2 に答える 2

1

A Form(または実際には any Control) は、破棄されるときにその子コントロールを破棄します。だから、あなたが見ているものは正常です。

目的を達成するには、DataGrid を破棄する前に Form の Controls コレクションから削除する必要があります。

アップデート

@ctacke がコメントで述べているように、DataGridスタティックを作成する必要を回避する代替手段はほぼ確実にありますが、詳細がないと推奨を行うことは困難です。

于 2012-12-05T15:22:32.203 に答える
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同じエラーが繰り返し発生することになります。

于 2012-12-06T14:46:50.377 に答える