c# Winform从窗体中的多个列表视图中删除所选项



我的winform 应用程序在一周中的每一天都有一个列表视图。每个列表视图(listSun,listMon,listTue等(都有一个当天的任务列表。我可以通过专门说明列表来删除该项目,但我无法通过选择使其工作。

我希望用户能够单击任何一天的项目,并使用简单的功能确定选择了哪个列表并删除了所选项目。

我目前尝试的逻辑是 Foreach 列表视图 在表单中删除所选项目。 这是我到目前为止尝试的代码。

  private void btnDelete_Click(object sender, EventArgs e)
        {
            foreach (ListView listview in this.Controls)
            {
                foreach (ListViewItem listitem in listview.SelectedItems)
                    listitem.Remove();
            }

当然这是行不通的,但我愿意接受修复或采取其他路线的建议。

这个怎么样?

首先,为 Form 类创建属性。

private ListView selectedListView {get; set;}

当用户选择某个项作为列表视图时,将其设置为属性。

// ListView Clicked Event
var userSelected = (ListView)sender;
if(userSelected.SelectedItem != null)
    selectedListView = (ListView)sender;

并使用 selectedListView.Items.Remove(( 删除 SelectedItem。

此错误的原因是:

   foreach (ListView listview in this.Controls)
            {
                foreach (ListViewItem listitem in listview.SelectedItems)
                    listitem.Remove();
            }

Foreach 循环在内部将集合的项强制转换为左侧变量类型(在本例中为列表视图(。

所以发生的事情是...您在this. Controls内部有不同的控件,例如标签,分组框等...当您像这样尝试 foreach 并点击该控件集合中的标签时,foreach 循环会尝试将标签强制转换为 listview,但会失败。

你可以用一些linq来解决这个问题,方法是将你的this.Controls foreach替换为:

foreach (ListView listview in this.Controls.OfType<Control>().
Where(c => c.GetType() == typeof(ListView)))
 {
      foreach (ListViewItem listitem in listview.SelectedItems)
      listitem.Remove();
 }

最新更新