【问题标题】:c# Winform remove selected item from multiple listviews in formc# Winform 从表单中的多个列表视图中删除所选项目
【发布时间】:2017-03-23 02:33:03
【问题描述】:

我的 winform 应用程序在一周中的每一天都有一个列表视图。每个列表视图(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();
            }

当然这不起作用,但我愿意接受修复或采取其他途径的建议。

【问题讨论】:

  • 你确定所有的 ListView 控件都是 this.Controls 的元素吗?也许你在 GroupBox 或 Panels 中做了 ListView。
  • 表单没有Groupboxes或Panels,listViews是通过设计器从工具箱中拖放的。
  • 你只是想从 listView 中删除 selectedItems,对吧?
  • 是的。我只是不想为所有 7 个列表视图(天)重复 foreach 代码。例外情况是:未处理 System.InvalidCastException HResult=-2147467262 消息=无法将“System.Windows.Forms.Label”类型的对象转换为“System.Windows.Forms.ListView”类型。
  • 你是在比较 ListViewItem 和一些标签吗?

标签: c# winforms listview


【解决方案1】:

这个怎么样?

首先,为 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 (ListViewItem listitem in selectedListView.SelectedItems) { listitem.Remove(); } 非常感谢!
  • @eatumup 很容易工作:p 检查我的答案,看看为什么它没有! :)
【解决方案2】:

这个错误的原因是这样的:

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

Foreach 循环在内部将集合的项转换为左侧变量类型 (在本例中为 ListView)。

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

您可以通过将 this.Controls foreach 替换为 linq 来解决此问题:

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

【讨论】:

  • 谢谢。现在我正在阅读您的评论,我记得在一两年前在 groupbox 中偶然发现了类似的带有按钮的东西。我不经常写......但最终我不得不指定TypeOf。我完全忘记了那部分语法。谢谢你提醒我
  • 不客气! ? 只需记住让您的集合成为相同类型的集合,这样您就可以在没有无效转换异常的情况下进行迭代。
  • 有趣的是,我遇到了另一个需要使用此答案的实例。但上面的语法并不完全正确。在此 winforms 案例中不存在 where 。所以对于那些可能看到这篇文章并参考它的人;这是正确的语法: foreach (ListView listview in this.Controls.TypeOf(ListView)) { foreach (ListViewItem listitem in listview.SelectedItems) listitem.Remove(); }
  • 好吧,我又读了一遍,我注意到,因为我在电话上写答案,没有编译器来检查语法错误,我在那里遇到了一些问题。也忘记了将所有控件都转换为控制通过执行this.Controls.OfType(Control).Where() 输入,否则您将无法在控件集合上执行 where,因此会出现错误。但是您的建议仍然有效,但我建议的内容将让您遍历更多控件,例如GroupBoxPanel 以及其他容器。我编辑了答案并修复了那里的语法错误。我很抱歉。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多