c#Winform从表单中的多个列表视图中删除选定项

c#Winform从表单中的多个列表视图中删除选定项,c#,winforms,listview,C#,Winforms,Listview,我的winform应用程序每周每天都有一个列表视图。每个listview(listSun、listMon、listTue等)都有一个当天的任务列表。我可以通过明确说明列表来删除该项,但我无法通过选择使其正常工作 我希望用户能够从任何一天点击一个项目,并用一个简单的功能确定什么列表是选定的,并删除选定的项目 我现在尝试的逻辑是删除所选项目表单中的Foreach listview。这是我到目前为止试过的代码 private void btnDelete_Click(object sender,

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

我希望用户能够从任何一天点击一个项目,并用一个简单的功能确定什么列表是选定的,并删除选定的项目

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

  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。

这个怎么样

首先,为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循环在内部将集合项强制转换为左侧变量类型 (在本例中为其ListView)

所以发生的是。。。这里面有不同的控件。控件如标签、分组框等。。。 当您尝试这样的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();
 }
foreach(此.Controls.OfType()中的ListView ListView)。
其中(c=>c.GetType()==typeof(ListView)))
{
foreach(listview中的ListViewItem listitem.SelectedItems)
Remove();
}

此错误的原因如下:

   foreach (ListView listview in this.Controls)
            {
                foreach (ListViewItem listitem in listview.SelectedItems)
                    listitem.Remove();
            }
Foreach循环在内部将集合项强制转换为左侧变量类型 (在本例中为其ListView)

所以发生的是。。。这里面有不同的控件。控件如标签、分组框等。。。 当您尝试这样的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();
 }
foreach(此.Controls.OfType()中的ListView ListView)。
其中(c=>c.GetType()==typeof(ListView)))
{
foreach(listview中的ListViewItem listitem.SelectedItems)
Remove();
}


您确定所有的ListView控件都是这个.controls的元素吗?可能您在GroupBox或Panels中创建了ListView。表单没有GroupBox或Panels,ListView是通过设计器从工具箱中拖放的。您只想从ListView中删除selectedItems,对吗?是的。我只是不想对所有7个ListView(天)重复foreach代码。异常情况是:System.InvalidCastException未经处理HResult=-2147467262 Message=无法将“System.Windows.Forms.Label”类型的对象强制转换为“System.Windows.Forms.ListView”。是否将ListViewItem和某个标签进行比较?是否确定所有ListView控件都是此.controls的元素?可能您在GroupBox或Panels中创建了ListView。表单没有GroupBox或Panels,ListView是通过设计器从工具箱中拖放的。您只想从ListView中删除selectedItems,对吗?是的。我只是不想对所有7个ListView(天)重复foreach代码。例外情况是:System.InvalidCastException未经处理HResult=-2147467262 Message=无法将类型为“System.Windows.Forms.Label”的对象强制转换为类型为“System.Windows.Forms.ListView”。您是否将ListViewItem与某个标签进行比较?我花了一秒钟的时间才明白您的建议,但一旦我这样做,它就工作得很好。它甚至清理了我没有写但认为我要写的代码。最终完成foreach(selectedListView.SelectedItems中的ListViewItem listitem){listitem.Remove();}非常感谢@eatumup本可以轻松工作的:p检查我的答案,看看为什么没有我花了一秒钟的时间才明白你的建议,但一旦我明白了,效果就很好了。它甚至清理了我没有写但认为我要写的代码。最终完成foreach(selectedListView.SelectedItems中的ListViewItem listitem){listitem.Remove();}非常感谢@eatumup本可以轻松工作的:p检查我的答案,看看为什么没有非常感谢。现在我读到了你的评论,我记得一两年前在一个群组框中偶然发现了一个类似的按钮。我不常写信。。。但最终我必须指定的类型。我完全忘记了那部分语法。谢谢你提醒我不客气!有趣的是,我遇到了另一个需要使用这个答案的例子。但是上面的语法不太正确。在此winforms案例中不存在。因此,对于那些可能看到这篇文章并参考它的人;以下是正确的语法:foreach(此.Controls.TypeOf中的ListView ListView)){foreach(ListView中的ListViewItem listitem.SelectedItems)listitem.Remove();}我又读了一遍,我注意到因为我在电话上写答案,没有编译器检查语法错误,我在那里遇到了一些问题。还忘了通过执行
this.controls.OfType(Control.Where()
将所有控件强制转换为conntrol类型,否则您将无法在控件集合中执行Where操作,因此出现了错误。but t t直到您建议的仍然有效,但我建议的将允许您迭代更多控件,如
GroupBox
Panel
,以及其他容器