2

.aspxファイルには、通常のhtmlコードと「Panel1」コントロールが含まれています。まず、「ddl」というドロップダウンリストを作成し、それにいくつかのListItemを追加します。これはすべてコードビハインドからのものです。次に、特定の数の他のDropDownListを作成し、「ddl」に追加したすべてのListItemをコピーします。その後、ページの実行時に「Panel1」コントロールに追加する必要があります。最も重要な部分は、動的に作成されたすべてのドロップダウンリストに、ページの実行時に選択された値を持たせたいということです。以下のコードを見ることができます:

protected void Page_Load(object sender, EventArgs e)
{
    DropDownList ddl = new DropDownList();
    ddl.Items.Add(new ListItem("One", "1"));
    ddl.Items.Add(new ListItem("Two", "2"));
    ddl.Items.Add(new ListItem("Three", "3"));
    ddl.Items.Add(new ListItem("Four", "4"));
    ddl.Items.Add(new ListItem("Five", "5"));
    ddl.Items.Add(new ListItem("Six", "6"));
    ddl.Items.Add(new ListItem("Seven", "7"));

    int j = 2;
    for (int h = 0; h < 3; h++)
    {
        DropDownList ddlDynamic = new DropDownList();

        //Add the items from ddl to the new dropdownlsit
        for (int i = 0; i < ddl.Items.Count; i++)
        {
            ddlDynamic.Items.Add(ddl.Items[i]);
        }
        //the selected item in the first dropdownlist 
        //must be "Two" but it will be "Four". WHY???
        ddlDynamic.SelectedValue = j.ToString();
        ddlDynamic.ID = h.ToString();
        Panel1.Controls.Add(ddlDynamic);
        Panel1.Controls.Add(new LiteralControl("<br />"));
        j++;
    }
}

ここでの問題は、3つのドロップダウンリストすべてで選択された値が同じで、「4」になることです。論理的には、最初の値は「2」、2番目の「3」、3番目の値は「4」である必要があります。最初の質問は:私は何が間違っているのですか?

2番目の質問。ddlDynamic.Items.FindByValue(j.ToString()).Selected = true;代わりに使用するとddlDynamic.SelectedValue = j.ToString();、「ドロップダウンリストで複数のアイテムを選択できません」というメッセージが表示されます。何故ですか?

ありがとうございました。

4

3 に答える 3

2

私は答えを見つけました。ここで重要なことは、そのddlDynamic.Items.Add(ddl.Items[i]);行を覚えて、「ddl」ドロップダウンリストから参照によってアイテムを追加し、「for」ループで動的に作成された各DropDownListsにListItemsをコピーしないことです。動的に作成されたすべてのドロップダウンリストは、以前に初期化されて「ddl」に追加された同じListItemsを使用しています。次のことを知っておくことが重要です。

ddlDynamic.DataSource = ddl.Items;
        ddlDynamic.DataBind();

同じことを行います:「ddl」からの参照によってListItemsを使用します。したがって、私が見つけた解決策は、動的に作成されたDropDownListごとにListItemを作成し、ソースからそれらを設定することです。この場合、DataTableになります。

protected void Page_Load(object sender, EventArgs e)
{
    DataTable table = new DataTable();
    table.Columns.Add("text", typeof(string));
    table.Columns.Add("value", typeof(string));

    table.Rows.Add("One", "1");
    table.Rows.Add("Two", "2");
    table.Rows.Add("Three", "3");
    table.Rows.Add("Four", "4");
    table.Rows.Add("Five", "5");
    table.Rows.Add("Six", "6");
    table.Rows.Add("Seven", "7");

    int j = 1;
    for (int h = 0; h < 3; h++)
    {
        DropDownList ddlDynamic = new DropDownList();
        foreach (DataRow rw in table.Rows)
        {
            ddlDynamic.Items.Add(new ListItem((string)rw["text"], (string)rw["value"]));
        }

        ddlDynamic.SelectedValue = j.ToString();
        ddlDynamic.ID = h.ToString();
        Panel1.Controls.Add(ddlDynamic);
        Panel1.Controls.Add(new LiteralControl("<br />"));
        j++;
    }
}

誰かがより良いアイデアを持っているなら、私に知らせてください。

于 2012-11-24T22:10:51.600 に答える
1

あなたは正しい答えを持っていました。私はコードをいじっていて、先に進んで自分が持っていたものを投稿しようと思いました.

protected void Page_Load(object sender, EventArgs e)
{
    var numListControls = 3;
    for (int i = 0; i < numListControls; i++)
    {
        var newList = new DropDownList() { ID = i.ToString() };
        newList.Items.AddRange(GetListItems(i + 1));
        Panel1.Controls.Add(newList);
        Panel1.Controls.Add(new LiteralControl("<br />"));
    }        
}

string[] values = new[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven" };
public ListItem[] GetListItems(int selectedValue)
{           
    return values.Select((val, pos) => new ListItem() {
        Text=val, 
        Value=(pos + 1).ToString(), 
        Selected = selectedValue == pos
    }).ToArray();
}
于 2012-11-24T22:40:27.013 に答える
0

この記事を読むことをお勧めします。「プレースホルダーに追加されたすべてのコントロールが ViewState にも自動的に追加されると想定するのは簡単ですが、そうではありません」

于 2012-11-24T21:28:48.007 に答える