2012-07-28 122 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

相关问题