【问题标题】:C# delete tagged ObjectC# 删除标记的对象
【发布时间】:2017-09-06 06:23:55
【问题描述】:

我对“标签”的使用有疑问:

我有一个 ListBox 或 ListView,其中有我的对象的名称,我添加了一个“Tag”属性来查找其对应的对象:

foreach(Operation op_ass in ListOpAss1)
    {
        op_ass.getNom(Properties.Settings.Default.Langue);
        ListViewItem item = new ListViewItem(op_ass.Nom);
        item.Tag = op_ass;
        listBoxAss1.Items.Add(op_ass.Nom);
    }

现在我想要的是,当我在列表中选择一个(或多个)项目时,对相应的对象进行操作。但是我怎样才能找回他们呢? 例如,我想从列表中删除选定的对象,或者获取操作 ID 列表(在我的列表中不显示 ID)。

【问题讨论】:

    标签: c# winforms tags


    【解决方案1】:

    看起来您正在将属性 op_ass.Nom 添加到列表框中,而不是 ListViewItem item。修改你的代码如下:

    foreach (Operation op_ass in ListOpAss1)
       {
           op_ass.getNom(Properties.Settings.Default.Langue);
           ListViewItem item = new ListViewItem(op_ass.Nom);
           item.Tag = op_ass;
    
           // Add the list view item instead of op_ass.Nom
           listBoxAss1.Items.Add(item);
       }
    

    现在您应该能够从选定的项目/项目中检索标签,如下所示:

    var operation = ((listBox1.SelectedItem as ListViewItem).Tag) as Operation;
    

    或者,您可以考虑如下使用数据绑定:

     foreach (Operation op_ass in ListOpAss1)
       {
          op_ass.getNom(Properties.Settings.Default.Langue);
       }
    
     listBoxAss1.DataSource = ListOpAss1;
     listBoxAss1.DisplayMember = "Nom";
    

    并访问数据绑定对象如下:

    var operation = listBox1.SelectedItem as Operation;
    

    【讨论】:

    • 完美运行,谢谢。只是为了取回选定的项目,你的语法不起作用,我只是把这个: var operation = listBoxAss1.SelectedItem as Operation;并且作为一种魅力,标签甚至不需要,因为我的列表框包含所有对象:)
    • 不客气.. :) 如果您使用数据绑定,那么后一种转换方式是可行的方法..前一种(转换为 ListViewItem)不适用于数据绑定
    • 对不起,没有注意到最后一行,无论如何谢谢你解决了我的问题:)
    【解决方案2】:

    使用 foreach 有点不推荐使用,您可以在对象列表中查看已实现的函数

    ListOpAss1.ForEach(x=> 
    {
        x.getNom(Properties.Settings.Default.Langue);
        var item = new ListViewItem(x.Nom);
        item.Tag = x;
        listBoxAss1.Items.Add(x.Nom);
    });
    

    为了在列表中选择一个项目,您可以对多个文件使用 SingleOrDefalt() 或 Skip(count) take (count),或者您可以运行带有条件的本机查询来搜索这样的列表

    var items = collection.Where(x=> x.City == "Burgas").ToList(); //You can use select if you want only certain properties of the object to be selected
    ///then you can use that new item list to remove the objects from the collection list like this
    items.ForEach(x=> 
    {
        collection.Remove(x);
    });
    

    【讨论】:

    • “使用 foreach 有点过时”。说什么?不,不是。
    • 您的回答并没有解决问题。你刚刚用一种同样错误的新方式重写了它。就像有问题的代码一样,您实际上从未将item 添加到任何内容中。
    • 好吧,在 list 上使用已实现的 ForEach 效率更高,并且节省了一些空间,毕竟如果微软的人们不以旧方式使用它们,为什么还要进行新的实现。使代码更小且可重新编写。(这就是我不推荐使用的意思,并不是说它没有使用...我很少使用它,但毕竟每个人都可以做任何他想做的事)
    • 恐怕“新”!=“更好”。但你是对的,这是个人喜好。如果您没有将其称为已弃用,我会保留它。
    • 不是这样,因为他的代码中有错误,早上没有看到,但通常当他尝试在他所在的集合中插入任何内容时会出现运行时错误教学
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多