Gridviewの中にdropdownlistがあり、gridviewの読み込み時にデータソースから読み込まれます。誰かがドロップダウンリストをループし、if条件に基づいてリストから特定のアイテムを削除する方法を教えてもらえますか?.
アイテムをループする必要はありません。アイテムを見つけて削除するだけです。
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
}
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
列挙子オブジェクトを使用している間はコレクションを変更できないため、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
をデクリメントする必要があります。そうしないと、すべてのアイテムを評価しない可能性があります。
なぜfor each item in mycollection.ToList()
を使用できないのですか?コレクションは実際のリスト自体ではなくリストのコピーに変換されるため、この方法でリストの反復中に変更を加えることができます。