2013-05-30 191 views
2

我有一個數據庫中包含一堆不同的控件的表。在我的Page_Init方法中,我需要根據正在傳入的Session變量加載適當的控件。是否有更好的方法來完成此操作,然後使用一大堆if..else語句?我有大約15到20個不同的場景,所以我不想寫20個if..else語句。任何幫助是極大的讚賞!替代if..else語句

DataTable的題爲 「值」 有三列:(ID,名稱,描述):

ID | Name | Description 
------------------- 
1 | A | First 
2 | B | Second 
3 | C | Third  

這裏是我的代碼:

ControlOne c1; 
ControlTwo c2; 
ControlThree c3; 

protected void Page_Init(object sender, EventArgs e) 
{ 
    DataSet DS = Client.GetInformation(Session["Number"].ToString()); 
    DataRow DR = DS.Tables["Value"].Rows[0]; 

    if (DR["Name"].ToString() == "A" && DR["Description"].ToString() == "First") 
    { 
     c1 = (ControlOne)LoadControl("~/ControlOne.ascx"); 
     panel1.Controls.Add(c1); 
    } 
    else if (DR["Name"].ToString() == "B" && DR["Description"].ToString() == "Second") 
    { 
     c2 = (ControlTwo)LoadControl("~/ControlTwo.ascx"); 
     panel1.Controls.Add(c2); 
    } 
    else if (DR["Name"].ToString() == "C" && DR["Description"].ToString() == "Third") 
    { 
     c3 = (ControlThree)LoadControl("~/ControlThree.ascx"); 
     panel1.Controls.Add(c3); 
    } 
    else if... //lists more scenarios here.. 
} 
+5

你的意思是一個switch語句? –

+0

使用字符串映射到類型。 –

+0

如何連接串並使用開關盒。 –

回答

0

您可以使用switch語句。

但是,有一個更好的方法。您的示例在數據庫表中具有ID,名稱,說明。所以保持名稱字段與usercontrol名稱相同,你可以這樣做:

string controlName = dr["Name"]; 
c1 = LoadControl(string.Format("~/{0}.ascx", controlName)); 
panel1.Controls.Add(c1); 

希望這會有所幫助。

+0

非常感謝您的幫助!對此,我真的非常感激! –

0

在我看來,你可以使用一個開關聲明,並且只對「名稱」或「描述」進行測試。

7

你可以做這樣的事情:

var controlsToLoad = new Dictionary<Tuple<string, string>, string>() 
{ 
    { Tuple.Create("A", "First"), "~/ControlOne.ascx" }, 
    { Tuple.Create("B", "Second"), "~/ControlTwo.ascx" }, 
    { Tuple.Create("C", "Third"), "~/ControlThree.ascx" }, 
    ... 
}; 

var key = Tuple.Create(DR["Name"].ToString(), DR["Description"].ToString()); 
if (controlsToLoad.ContainsKey(key)) 
{ 
    Control c = LoadControl(controlsToLoad[key]); 
    panel1.Controls.Add(c); 
} 

這是更緊湊,更容易比一個巨大的if..else或switch塊讀取。

+4

請注意,您可能希望字典是一個字段,而不是本地字典,只是因爲無需在每次回發時重新創建該字典。 – Servy

+0

非常感謝您的幫助!這是一個非常好的主意,經過深思熟慮! –