2013-03-22 99 views
4

我需要从列表视图中删除的项目,我要找的代码会显示一个消息框,确认,如果没有选中的项,它会显示一个错误消息框删除项目在C#

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

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

的错误是不删除,但在messageboxs我有两个messagesbox,ERREUR必须首先显示确认之前。

+0

您是否获得在输出窗口中的任何错误? – Thelonias 2013-03-22 14:03:07

+0

你会得到什么例外? – 2013-03-22 14:03:41

+0

我没有得到错误,也没有例外,我实际上可以删除项目,但是,错误是在messageboxs, 非常感谢:) – mabezat 2013-03-22 14:05:32

回答

8

开始从最终要计数零

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", ...); 
+0

错误不是在删除,但在messageboxs我有两个messagebox,错误必须先确认之前显示 – mabezat 2013-03-22 14:09:09

+2

是的,因为你测试为null ,而不是SelectedItems集合从不为空,如果没有选择存在它是一个空集合 – Steve 2013-03-22 14:10:01

+0

好吧,那么我该如何解决这个问题?请 – mabezat 2013-03-22 14:13:26

0

你可以只使用这个代码不 - 递减

listView1.Items[i].Remove(); 

注意:您还可以通过specifing位置

使用
0

您需要将确认MessageBoxShow更改为ShowDialog。这将使其变为模态并等待结果。

您需要检查emptry的“SelectedItems”

+0

我得到这个错误(错误'System.Windows.Forms。MessageBox'不包含'ShowDialog'的定义\t) – mabezat 2013-03-22 14:11:25

+0

噢,好的,我以为你在使用WPF。 – Thelonias 2013-03-22 14:13:49

0

你可以改变这样的代码。请注意,ListView.SelectedIndices集合包含所选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); 
1

你不应该引用您的迭代过程中使用的是原来的集合,但其他一些:

  foreach(ListViewItem item in listView1.Items) 
       if (item.Selected) 
        listView1.Items.Remove(item); 
+0

这也工作,谢谢你 – mabezat 2013-03-22 14:20:01

+2

你不能修改集合,而枚举它 – Thelonias 2013-03-22 14:20:58

0
//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]); 
        } 
       } 
      }