我对 C# 很陌生,对处理静态类/方法也很陌生。我正在开发一个以前只是独立的应用程序,现在正在转换为插件应用程序。我有一个插件是全局数据表,另一个插件是一个模型,它使用全局数据表的副本,但可以在运行模型之前进一步操作它。因此,我创建了一个名为 DatasheetControl 的自定义控件。全局数据表插件和建模插件使用控件的实例。我正在修复与从独立数据表到在 2 个不同插件中访问此控件相关的错误。控件用于获取和设置列信息的类。
public class dtColumnInformation
{
//table to operate with
private DataTable _dt = null;
//dictionary to hold column info
private Dictionary<string, bool> dictColstatus = null;
//class variable
private static dtColumnInformation dtCI = null;
// method initializes a datatable cols information structure to all enabled
public dtColumnInformation(DataTable dt)
{
if (dt != null)
{
_dt = dt.Copy();
dictColstatus = new Dictionary<string, bool>();
for (int c = 0; c < _dt.Columns.Count; c++)
{
dictColstatus.Add(_dt.Columns[c].ColumnName.ToString(), true);
}
}
}
// constructor optionally calls method to init the column information structure
// and return the itself - singleton
public static dtColumnInformation getdtCI(DataTable dt, bool init)
{
//pass null after initialization to access the DTcolInfo property
//or pass init=true (after import) to initialize
if (dtCI == null || init) dtCI = new dtColumnInformation(dt);
return dtCI;
}
// method returns the enable/disable status of the column name (key)
public bool getColStatus(string key)
{
//returns the status of a row
bool boolStatus;
dictColstatus.TryGetValue(key, out boolStatus);
return boolStatus;
}
// method to set a table column to enable/disable
public void setColStatus(string key, bool val)
{
//sets the status of a column
dictColstatus[key] = val;
}
// property - structure to return column status of all columns in table...
public Dictionary<string, bool> DTColInfo
{
//returns a col-status dictionary for all cols in the datatable
set { dictColstatus = value; }
get { return dictColstatus; }
}
这在一些位置(包括全局数据表插件)中使用,调用类似于以下内容:
//(builds dictionary of keys, <string>datetime and values <bool>enabled/disabled col)
dsControl1.DTCI = VBCommon.Metadata.dtColumnInformation.getdtCI(dsControl1.DT, true);
所以,我开始明白为什么这不起作用。当我在全局数据表和模型之间来回切换时,dictColStatus 并没有维护每个单独的状态。当我右键单击 col 标题并想要选择是启用禁用的 col 还是禁用它时,这就会发挥作用。此函数的方法查看 dictColStatus 中的内容,以决定在右键单击菜单中填充哪些选项。
我需要将此 dtColumnInformation 类中的静态内容更改为不是静态的,以便维护控件的每个实例。我知道我需要通过实例化 dtColumnInformation 类的实例来做一些事情。但是
private static dtColumnInformation dtCI = null;
和
public static dtColumnInformation getdtCI(DataTable dt, bool init)
把我甩了。我不太清楚他们在做什么以及如何在我的课程中进行更改以不使用静态的东西。谢谢!