为了账号安全,请及时绑定邮箱和手机立即绑定

选择然后删除选定的列表项

选择然后删除选定的列表项

C#
繁星点点滴滴 2021-11-14 14:57:37
我有一些行,我希望用户能够通过 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();
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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 循环并删除 List :


for (int i = lvTasks.SelectedItems.Count - 1; i >= 0; i--)

{

 ListViewItem itm = lvTasks.SelectedItems[i];

 lvTasks.Items[itm.Index].Remove();

}

那应该有效。


查看完整回答
反对 回复 2021-11-14
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我会使用一个while循环:


if (e.KeyCode == Keys.Delete) 

{

   while (lvTasks.SelectedItems.Count > 0)

   {

      lvTasks.SelectedItems[0].Remove();

   }

}


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信