C# DataGrid上的对象处理异常
我有一个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
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进行子类化以添加所需的行为。