2012-07-28 92 views
0

我有兩個GridViews。我有方法GetGeneralDiagnosis返回所有診斷的列表:如何在沒有全局變量的情況下始終保持變量?

CODE診斷
F50飲食失調
F51非器質性睡眠障礙

和方法GetSpecificDiagnosis返回更具體名單:

CODE診斷
F50.0神經性厭食症
F50.1非典型神經性厭食症
F51.0非器質性失眠症
F51.1非器質性過度

其根據從第一GridView的常規診斷特異性診斷綁定到第二GridView控件現在我有方法。

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Code"].ToString(); 
    var ICD10 = Visit.GetSpecificDiagnosis(); // here I'm getting data from database 
    gvSpecificDiagnosis.DataSource = ICD10.Where(i => i.ICD10Code.Contains(generalDiagnosis)).Select(i => new { i.ICD10Name, i.ICD10Code }); 
    gvSpecificDiagnosis.DataBind(); 
} 

我不想在每次選定索引更改時連接到數據庫。

我怎樣才能讓我的清單var ICD10 = Visit.GetSpecificDiagnosis()只有一次?我聽說全局變量是非常糟糕的主意,那麼我怎樣才能以另一種方式做到這一點?

回答

1

您可以使用私有成員變量。只要包含它的階級活着,這個人就「活着」。如果有必要,用一個屬性包裝它來訪問它並自動從數據庫中讀取它。

private TypeOfICD10 _icd10; 
private TypeOfICD10 ICD10 
{ 
    get 
    { 
     if (_icd10 == null) { // Get from database. 
      _icd10 = Visit.GetSpecificDiagnosis(); 
     } 
     return _icd10; 
    } 
} 

現在你可以使用它像這樣,它會從數據庫中只在第一次調用讀取

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Name"].ToString(); 
    gvSpecificDiagnosis.DataSource = ICD10 
     .Where(i => i.ICD10Code.Contains(generalDiagnosis)) 
     .Select(i => new { i.ICD10Name, i.ICD10Code }); 
    gvSpecificDiagnosis.DataBind(); 
} 
+0

非常感謝!爲什麼我沒有想到它:) – vanilla161 2012-07-28 17:34:18

1

您可以讓Visit類緩存返回的數據。

GetSpecificDiagnosis被調用時,它將檢查這個數據是否已經從數據庫中檢索出來,如果是的話就返回。如果不是,它會從數據庫中檢索它並將其保存到其緩存中。

你應該注意的一件事是這個數據是否是靜態的(即在整個應用程序的生命週期中永遠不會改變)還是動態的。在第一種情況下,您不必進行任何特殊處理,但如果是後者,則必須使緩存失效,而數據庫中的信息已更改。

我建議您到have a look here以瞭解如何開始使用ASP.NET中的緩存。

0

我不知道很多有關Visist類從你的問題,但爲什麼不緩存ICD10這種方式,您將使用緩存的對象和數據庫調用將提出只有當緩存鍵ICD10具有null值

例子:

if(Cache["ICD10"] == null) 
{ 
var ICD10 = Visit.GetSpecificDiagnosis(); 
Cache["ICD10"] = ICD10; 
} 
else 
{ 
var ICD10 = Cache["ICD10"]; 
} 
+0

好的,但是當我使用'var ICD10 = Cache [「ICD10」]'時,我看不到像Select,Where等Intellisense中的方法。我試着寫'(ICD10如列表)。其中(...)'但是我的變量ICD10爲空。 – vanilla161 2012-07-28 17:28:16

+0

Cache [「ICD10」] = Visit.GetSpecificDiagnosis();當你把它扔出來時,它會恢復到原來的類型 – HatSoft 2012-07-28 17:33:33

相關問題