2012-08-30 82 views
1

我對C#相當陌生,對於處理靜態類/方法也很新穎。我正在開發一個應用程序,它以前只是一個獨立的應用程序,現在正在轉換爲一個插件應用程序。我有1個插件是全局數據表,另一個插件是使用全局數據表副本的模型,但可以在運行模型之前進一步操作它。 因此,我創建了一個名爲DatasheetControl的自定義控件。全局數據表插件和Modeling插件使用控件的一個實例。我正在修復與從獨立數據錶轉到使用兩個不同插件訪問此控件相關的錯誤。 控件用於獲取和設置列信息的類。C#將靜態方法改爲不是靜態的

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) 

扔我。我不完全清楚他們在做什麼以及如何在整個班級中進行更改以不使用靜態事物。 謝謝!

+0

歡迎來到C#!您可能想看看.NET指南的名稱:http://msdn.microsoft.com/en-us/library/ms229002 – Tergiver

回答

1

getDtCI()只是一個使用單個值緩存的初始化程序。如果靜態字段尚未初始化,則它將其初始化並返回靜態字段中的值。如果傳入的init參數爲true,那麼它將爲靜態字段初始化一個新值並返回該值。靜態字段的前一個值將被丟棄。使用init = false多次調用getdtCI()將返回相同的dtColumnInformation實例。這個單一值緩存可能是爲了節省內存,以獲得大量需要和/或構建昂貴的東西。

如果你想擁有多個容器與獨立的dtColumnInformation對象,你將不得不以某種方式改變它。最簡單的方法是完全消除單個項目緩存 - 將getdtCI()更改爲始終創建一個新的dtColumnInformation實例。查看對getdtCI()的引用以調查代碼影響。如果構造dtColumnInformation不需要大量時間或內存,並且代碼不會調用getdoc()數百萬次,那麼您可能完全消除靜態緩存並始終構造dtColumnInformation的新實例。

如果始終構造一個新的dtColumnInformation花費太多時間或消耗大量內存,則可以將單個項目緩存存儲位置從dtColumnInformation類移出到使用dtColumnInformation實例的容器類中。也許這就是你的DatasheetControl。最直接的方法是將靜態字段和getdtCI()靜態方法移動到容器類。

如果您遇到調用getdtci()的代碼,該代碼無法訪問容器類,那麼使用此簡單解決方案時將遇到問題。除此之外,它變得非常醜陋。 :P