6

からアイテムを削除する必要がありListViewます。探しているコードは確認のためにメッセージボックスを表示し、アイテムが選択されていない場合はエラーメッセージボックスを表示します

これは私のコードであり、動作していません:(

private void button2_Click(object sender, EventArgs e)
{
    if (listView1.SelectedItems != null)
    {
        var confirmation = MessageBox.Show(
            "Voulez vous vraiment supprimer les stagiaires séléctionnés?",
            "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question
        );

        if (confirmation == DialogResult.Yes)
        {
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (listView1.Items[i].Selected)
                {
                    listView1.Items[i].Remove();
                    i--;
                }
            }
        }
    }
    else
    {
        MessageBox.Show("aucin stagiaire selectionnes", "erreur",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

エラーは削除ではありませんが、MessageBox'sI have twoMessageBox'sでは、確認する前にエラーを最初に表示する必要があります。

4

6 に答える 6

13

ゼロになる最後からカウントを開始します

for (int i = listView1.Items.Count - 1; i >= 0; i--)
{
    if (listView1.Items[i].Selected)
    {
        listView1.Items[i].Remove();
    }
}

ただし、すべてのListViewItemにはIndexプロパティがあり、そのコレクションを使用すると、冗長なテストや少数のアイテムのループを回避できるという利点があることを考慮してください。

(SelectedItemsコレクションがnullになることはありません。選択が存在しない場合、コレクションは空ですがnullではありません)

したがって、コードを書き直すことができます

if (listView1.SelectedItems.Count > 0)
{
    var confirmation = MessageBox.Show("Voulez vous vraiment supprimer les stagiaires séléctionnés?", "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (confirmation == DialogResult.Yes)
    {
        for (int i = listView1.SelectedItems.Count - 1; i >= 0; i--)
        {
            ListViewItem itm = listView1.SelectedItems[i];
            listView1.Items[itm.Index].Remove();
        }
    }
}
else
    MessageBox.Show("aucin stagiaire selectionnes", ...);
于 2013-03-22T14:03:11.743 に答える
2

反復中に使用している元のコレクションを参照するのではなく、他のコレクションを参照する必要があります。

foreach(ListViewItem item in listView1.Items)
   if (item.Selected)
     listView1.Items.Remove(item);
于 2013-03-22T14:17:55.277 に答える
0

MessageBox確認を からShowに変更する必要がありますShowDialog。これにより、モーダルになり、結果を待ちます。

「SelectedItems」で空を確認する必要があります

于 2013-03-22T14:08:24.373 に答える
0

このようにコードを変更できます。ListView.SelectedIndicescollection は、選択した のインデックスを保持することに注意してくださいListViewItems。それらを最後から最初に向かって繰り返すだけで、インデックスの更新を処理する必要はありませんが、forループのままにしておきます。

            if (listView1.SelectedIndices.Count>0)
            {
                var confirmation = MessageBox.Show("Voulez vous vraiment supprimer les stagiaires séléctionnés?", "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (confirmation == DialogResult.Yes)
                {
                    for (int i = listView1.SelectedIndices.Count-1; i >= 0; i--)
                    {

                        listView1.Items.RemoveAt(listView1.SelectedIndices[i]);

                    }
                }
            }
            else
                MessageBox.Show("aucin stagiaire selectionnes", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
于 2013-03-22T14:13:11.600 に答える
0

--decrement なしでこのコードだけを使用できます

listView1.Items[i].Remove();

RemoteAt method注:位置を指定して使用することもできます

于 2013-03-22T14:05:21.053 に答える