私はそれをしたいのですが、リストボックスは削除するたびに変わるため、新しいオブジェクトを実行しようとしてもランタイム例外がスローされます。
私はこのようにしてみました:
ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
selectedItems = lstClientes.SelectedItems;
if (lstClientes.SelectedIndex != -1)
{
foreach (string s in selectedItems)
lstClientes.Items.Remove(s);
}
else
MessageBox.Show("Debe seleccionar un email");
コレクションを(foreach
を使用して)繰り返し処理している間は、コレクションを変更できません。代わりに、逆のfor
ループを使用します。
ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
selectedItems = lstClientes.SelectedItems;
if (lstClientes.SelectedIndex != -1)
{
for (int i = selectedItems.Count - 1; i >= 0; i--)
lstClientes.Items.Remove(selectedItems[i]);
}
else
MessageBox.Show("Debe seleccionar un email");
逆ループを使用すると、それらを削除した後にスキップしないようにします。
selectedItems = lstClientes.SelectedItems;
この行は新しいコレクションを作成しませんが、リストボックス内のコレクションへの参照を設定します。したがって、コレクションを繰り返し処理し、コレクションからアイテムを一度に削除しようとします。それは不可能
たとえば、これを使用できます。
foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
lstClientes.Items.Remove(s);
このようにシンプルです:
while (lst.SelectedItems.Count > 0)
{
lst.Items.Remove(lst.SelectedItems[0]);
}
lst.Items.Remove(lst.Items[lst.SelectedIndex]);
ループしたくない場合はこれを使用できます
注:これは、1つのアイテムを削除する場合にのみ機能します(複数選択すると、最初に選択したアイテムのみが削除されます)
より良い解決策を見つけました。
if (listBoxIn.SelectedItems.Count != 0)
{
while (listBoxIn.SelectedIndex!=-1)
{
listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);
}
}
今日、私はこの同じ問題に遭遇し、少しきれいなものを望み、このLinqソリューションを思い付きました。
foreach (int index in myListBox.SelectedIndices.Cast<int>().Select(x => x).Reverse())
myListBox.Items.RemoveAt(index);
基本的に、逆方向に反復して選択したアイテムを削除するPatrickのソリューションと同じです。ただし、逆方向に繰り返すのではなく、アイテムのリストを逆にして削除し、順方向に繰り返します。元の列挙に対して反復処理が行われないため、foreach内のアイテムを削除できます。
Patrickの答えに基づいて、同一のアイテムを削除せずに削除中のアイテムのインデックスを保持するため、逆インデックス削除を使用する傾向があります。
private void BtnDelete_Click(object sender, EventArgs e) {
if (listBox.SelectedIndex == -1) {
return;
}
// Remove each item in reverse order to maintain integrity
var selectedIndices = new List<int>(listBox.SelectedIndices.Cast<int>());
selectedIndices.Reverse();
selectedIndices.ForEach(index => listBox.Items.RemoveAt(index));
}
グローバル変数を作成します。
public partial class Form1 : Form
{
Int32 index;
}
次に、選択したインデックスの変更で、定義した変数にそのインデックスを保存します。
private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
{
layerindex = lsbx_layers.SelectedIndices[0];//selected index that has fired the event
}
最後に、要素を削除します:
lsbx_layers.Items.RemoveAt(Layerindex);
これは、選択したアイテムを削除する最も簡単な方法です
for(int v=0; v<listBox1.SelectedItems.Count; v++) {
listBox1.Items.Remove(listBox1.SelectedItems[v]);
}