2

データベースに、さまざまなコントロールを含むテーブルがあります。私の Page_Init メソッドでは、渡されるセッション変数に基づいて適切なコントロールをロードする必要があります。これを行うには、if..else ステートメント全体を使用するよりも良い方法はありますか? 15 から 20 の異なるシナリオが考えられるので、20 の if..else ステートメントを書きたくありません。どんな助けでも大歓迎です!

3 つの列 (ID、名前、説明) を持つ「値」というタイトルの DataTable:

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..
}
4

3 に答える 3

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 ブロックよりもコンパクトで、はるかに読みやすいです。

于 2013-05-30T20:47:05.317 に答える
0

switch ステートメントを使用して、「名前」または「説明」のいずれかのみをテストできるように思えます。

于 2013-05-30T20:46:43.003 に答える