web-dev-qa-db-ja.com

DropDownListからリスト項目を削除する

Gridviewの中にdropdownlistがあり、gridviewの読み込み時にデータソースから読み込まれます。誰かがドロップダウンリストをループし、if条件に基づいてリストから特定のアイテムを削除する方法を教えてもらえますか?.

14
Geetha

アイテムをループする必要はありません。アイテムを見つけて削除するだけです。

ListItem itemToRemove = myDropDown.Items.FindByValue("value");
if (itemToRemove != null)
{
    myDropDown.Items.Remove(itemToRemove);
}

または、削除するアイテムのインデックスがわかっている場合は、RemoveAtメソッドを使用します。

myDropDown.Items.RemoveAt(0);

しかし、とにかくループしたい場合は、ここにループがあります:

foreach (ListItem item in myDropDown.Items)
{
    // your stuff
}
37
Canavar

Foreachを使用してアイテムを削除することはできません。アイテムを削除すると、コレクションが変更され、ループが例外をスローするためです。

コレクションをループして複数のアイテムを削除する必要がある場合、最良の解決策は、コレクションを逆方向にループすることです。私のC#はかなり錆びているので、次はVBにあります。簡単に変換できるはずです。

For x As Integer = myDropDown.Items.Count - 1 to 0 Step -1
    Dim item As ListItem = myDropDown.Items(x)
    If item.TestToSeeIfItShouldBeRemoved = True
        myDropDown.Items.RemoveAt(x)
    End If
End For
7
Jason Berkan

列挙子オブジェクトを使用している間はコレクションを変更できないため、for-eachループは使用できません。これを行う最善の方法は、@ Jasonによって述べられているように、逆方向にカウントすることです。または、次のようなforループを使用します。

for (int i = 0; i < this.MyDropDownList.Items.Count; i++)
{
    //test to see if this item needs to be removed or not
    if (IsToBeRemoved(this.MyDropDownList.Items[i]))
    {
        this.MyDropDownList.Items.Remove(this.MyDropDownList.Items[i]);
        //re-set to next item in the list (count changed after item removed)
        i -= 1;
    }
}

ListItemを削除すると、DropDownListのアイテム数が変わることに注意してください。したがって、カウンター変数iをデクリメントする必要があります。そうしないと、すべてのアイテムを評価しない可能性があります。

2
J.Hendrix

なぜfor each item in mycollection.ToList()を使用できないのですか?コレクションは実際のリスト自体ではなくリストのコピーに変換されるため、この方法でリストの反復中に変更を加えることができます。

0
user2441818