私はC#にかなり慣れておらず、静的クラス/メソッドを扱うのは非常に初めてです。以前はスタンドアロンでしたが、現在はプラグイン アプリケーションに変換されているアプリケーションに取り組んでいます。グローバル データシートである 1 つのプラグインと、グローバル データシートのコピーを使用するが、モデルを実行する前にそれをさらに操作できるモデルである別のプラグインがあります。そこで、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 はそれぞれの個別の状態を維持していません。これは、列の見出しを右クリックして、無効な列を有効にするか無効にするかを選択したいときに機能します。この関数のメソッドは、右クリック メニューに入力するオプションを決定するために、dictColStatus の内容を確認します。
コントロールの各インスタンスが維持されるように、この dtColumnInformation クラスの静的なものを静的にならないように変更する必要があります。dtColumnInformation クラスのインスタンスをインスタンス化する必要があることはわかっていますが、
private static dtColumnInformation dtCI = null;
と
public static dtColumnInformation getdtCI(DataTable dt, bool init)
私を捨てています。彼らが何をしているのか、静的なものを使用しないようにクラス全体で変更を加える方法が正確にはわかりません。ありがとう!