代码之家  ›  专栏  ›  技术社区  ›  joei

选择然后删除所选列表项

c#
  •  0
  • joei  · 技术社区  · 6 年前

    我有一些行,我希望用户能够通过ctrl+a选择多行,然后可以通过按键盘上的Delete键删除选定的项。

    我的代码不起作用。按ctrl+A可以选择列表项,但按“删除”按钮后,将只删除一个项。

    private void lvTasks_KeyDown(object sender, KeyEventArgs e)
    {
         if (e.KeyCode == Keys.A && e.Control)
        {
            lvTasks.MultiSelect = true;
            foreach (ListViewItem item in lvTasks.Items)
            {
                item.Selected = true;
            }
        }
        if (e.KeyCode == Keys.Delete) 
        foreach (ListViewItem eachItem in lvTasks.SelectedItems)
        {
             DeleteTask();
        }
    }
    
    
    
    public void DeleteTask()
    {
        if (lvTasks.SelectedItems.Count > 0)
        {
    
    
                lvTasks.Items.Remove(lvTasks.SelectedItems[0]);
                Statics.SaveTasks(lvTasks.Items.Cast<ListViewItem>().Select(l => (Task)l.Tag).ToArray());
                UpdateTaskProgress(new Task());
                txtDownloadLink.Text = "";
                txtRarPassword.Text = "";
                txtReferenceLink.Text = "";
                chkBackupResource.Checked = Properties.Settings.Default.BackupSource;
                chkClearExtracted.Checked = Properties.Settings.Default.CleanExtract;
                chkRemoveRar.Checked = Properties.Settings.Default.RemoveRar;
                chkUseIDM.Checked = Properties.Settings.Default.UseIDM;
                chkRemoveDownload.Checked = Properties.Settings.Default.RemoveDownload;
                gbTaskProgress.SuspendLayout();
                settings = Statics.LoadSettings();
                gbTaskProgress.Controls.Clear();
                int max = Enum.GetValues(typeof(TaskProgresses)).Cast<int>().LastOrDefault();
                for (int i = 0; i <= max; i++)
                    gbTaskProgress.Controls.Add(new TaskProgress(i + 1) { Left = 10, Top = (20 + 24 * i), Caption = ((TaskProgresses)i).ToString().CapitalSplit(), Task = new Task() });
                gbTaskProgress.ResumeLayout();
                lvTasks.Items.Clear();
                Statics.LoadTasks().ToList().ForEach(t =>
                {
                    ListViewItem lvi = new ListViewItem(new string[] { (lvTasks.Items.Count + 1).ToString(), t.TaskName, $"{t.TaskId}", $"{t.Progress}-{t.Status}" });
                    t.UI = this;
                    if (t.Status == TaskStatuses.Active) t.Status = TaskStatuses.NotStarted;
                    lvi.Tag = t;
                    lvi.SubItems[0].Tag = t.Progress;
                    lvTasks.Items.Add(lvi);
                });
    
    
            }
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Cesar    6 年前
    private void lvTasks_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.A && e.Control)
        {
         lvTasks.MultiSelect = true;
         foreach (ListViewItem item in lvTasks.Items)
         {
           item.Selected = true;
         }
        }
        if (e.KeyCode == Keys.Delete) 
        for (int i = lvTasks.SelectedItems.Count - 1; i >= 0; i--)
        {
         ListViewItem itm = lvTasks.SelectedItems[i];
         lvTasks.Items[itm.Index].Remove();
        }
    }
    

    编辑

    你的台词 lvTasks.Items.Remove(lvTasks.SelectedItems[0]);

    这就是问题所在。您只删除索引0处的项。你得绕过去。

    编辑2 只有当您想删除所有项目时,它才起作用。如果您真的只想删除选定的项目。更改for循环并删除列表:

    for (int i = lvTasks.SelectedItems.Count - 1; i >= 0; i--)
    {
     ListViewItem itm = lvTasks.SelectedItems[i];
     lvTasks.Items[itm.Index].Remove();
    }
    

    这应该行得通。

        2
  •  0
  •   Frank Ball    6 年前

    我会用一个while循环:

    if (e.KeyCode == Keys.Delete) 
    {
       while (lvTasks.SelectedItems.Count > 0)
       {
          lvTasks.SelectedItems[0].Remove();
       }
    }
    

    更正。谢谢塞萨尔!