6

我需要从 a 中删除项目ListView,我正在寻找的代码将显示一个 MessageBox 进行确认,如果没有选择任何项目,它将显示一个错误 MessageBox

这是我的代码,它不起作用:(

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);
    }
}

错误不在 delete 中,但在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 集合永远不会为空,如果不存在任何选择,则该集合为空但不为空)

所以你的代码可以重写

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 回答
1
//if (lvPhotos.SelectedIndices.Count > 0)
            if (lvPhotos.CheckedIndices.Count > 0)
            {
                var confirmation = MessageBox.Show("Supprimer les photos séléctionnées ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (confirmation == DialogResult.Yes)
                {
                    // selected
                    //for (int i = lvPhotos.SelectedIndices.Count - 1; i >= 0; i--)
                    //{
                    //    lvPhotos.Items.RemoveAt(lvPhotos.SelectedIndices[i]);
                    //}

                    // checked
                    for (int i = lvPhotos.CheckedIndices.Count - 1; i >= 0; i--)
                    {
                        lvPhotos.Items.RemoveAt(lvPhotos.CheckedIndices[i]);
                    }
                }
            }
于 2013-08-06T15:05:48.370 回答
0

您可以仅使用此代码而无需 -- 递减

listView1.Items[i].Remove();

注意:您也可以RemoteAt method通过指定位置来使用

于 2013-03-22T14:05:21.053 回答
0

您需要将确认MessageBox从更改ShowShowDialog。这将使它成为模态并等待结果。

您需要检查“SelectedItems”是否为空

于 2013-03-22T14:08:24.373 回答
0

您可以像这样更改代码。请注意,ListView.SelectedIndicescollection 包含 selected 的索引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 回答