0

ASP.NET Web フォーム DropDownList でこの予期しない動作が発生しました。ListItems をドロップダウン リストに追加していますが、すべて問題なく表示されます。ddl の値 (私の場合は Id) が設定されないことを除いて、ListItem のテキストに置き換えられます。

<asp:DropDownList ID="ddl1" runat="server">
        </asp:DropDownList>


    private void Populate()
    {
        List<ListItem> list = new List<ListItem>();
        foreach (var item in GetItems())
        {
            list.Add(new ListItem(item.name, item.id.ToString()));
            //in the drop down list the ListItem.Value is being replaced
            //by ListItem.Text when it is added to the ddl
        }

        ddl1.DataSource = list;
        ddl1.DataBind();

        ddl1.Items.Add(new ListItem("Make a selection"));
    }

    private List<Stuff> GetItems()
    {
        List<Stuff> list = new List<Stuff>();
        list.Add(new Stuff{ name = "bill", id = 1});
        list.Add(new Stuff{ name = "james", id = 2});
        return list;
    }

    private struct Stuff
    {
        public string name;
        public int id;
    }

これが起こることを意図している場合、何かアイデアはありますか? そして、名前とIDの両方をddlに保存するにはどうすればよいですか?

4

2 に答える 2

4

DataTextFieldおよびDataValueFieldプロパティを設定してみてください。

ddl1.DataTextField = "Text";
ddl1.DataValueField = "Value";
于 2012-07-07T08:30:57.697 に答える
4

populate メソッドでは、データ バインディングを行っていますが、リスト アイテムのリスト内のどの値にどのプロパティをバインドするかを指定していません。

これを行うには、DataTextFieldおよびDataValueFieldプロパティを設定する必要があります。

Populate コードを次のように変更する方が簡単な場合があります。

private void Populate() 
{ 

    foreach (var item in GetItems()) 
    { 
        ddl1.Items.Add(new ListItem(item.name, item.id.ToString())); 
    } 


    ddl1.Items.Insert(0, new ListItem("Make a selection")); 
} 

あるいは:

private void Populate() 
{ 
    GetItems().ForEach(x => dd1.Items.Add(new ListItem(x.name, x.id.ToString())));
    ddl1.Items.Insert(0, new ListItem("Make a selection")); 
} 

つまり、項目を DropDownList に直接追加するだけです。

元の例では、データバインディングを使用するために、ListItem のリストを作成する必要はありません。直接データバインドできます。この場合、コードは次のようになります。

private void Populate() 
{ 
    dd1.DataTextField = "name";
    dd1.DataValueField = "id"
    dd1.DataSource = GetItems();
    ddl1.Items.Insert(0, new ListItem("Make a selection")); 
}

つまり、値をどこから取得するかを DropDownList に指示する限り、もののリストに直接データバインドできます。SelectedItem は文字列ではなく Stuff であるため、多くの人がこのモデルを好みます。そのため、アイテムを直接表すオブジェクトが得られます。欠点は、ViewState が大きくなったことです ;-)

于 2012-07-07T08:31:34.783 に答える