You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm开发任务管理器时ListView添加进程出现重复条目如何解决

问题根因
  • 你每次触发鼠标抬起事件时,仅清空了自己定义的processId列表,没有清空ListView控件中已经存在的旧条目,每次点击都会把全量进程ID重新插入ListView,自然会出现重复。
  • 你创建ListViewItem时仅设置了Text属性,没有给Name属性赋值,而ListView.Items.ContainsKey()方法是通过匹配项的Name属性判断是否存在的,即使你写了相关去重逻辑也无法生效。
  • 你编写的do_job去重方法没有被任何代码调用,写好的去重逻辑完全没有执行。
修复方案

你可以选择两种实现方式,根据你的需求选即可:

  1. 全量刷新方案(适合定时更新进程列表的场景,逻辑最简单):每次加载进程前先清空ListView所有现有项,再插入最新的进程列表
  2. 增量去重方案:每次加载时仅插入不存在的新进程,已有的进程条目保留
修正后代码示例(全量刷新版本)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace Process_Manager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
            // 先清空现有ListView条目,避免重复
            listView1.Items.Clear();
            Process[] processes = Process.GetProcesses();
            foreach (Process t in processes)
            {
                ListViewItem listviewitemprocess = new ListViewItem(Convert.ToString(t.Id));
                // 可选:如果后续需要用ContainsKey判断,给Name属性赋值
                listviewitemprocess.Name = Convert.ToString(t.Id);
                listView1.Items.Add(listviewitemprocess);
            }
        }
    }
}
修正后代码示例(增量去重版本)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace Process_Manager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
            Process[] processes = Process.GetProcesses();
            foreach (Process t in processes)
            {
                string pidStr = Convert.ToString(t.Id);
                // 先判断当前进程ID是否已经存在于ListView中
                if (!listView1.Items.ContainsKey(pidStr))
                {
                    ListViewItem listviewitemprocess = new ListViewItem(pidStr);
                    // 必须给Name属性赋值,ContainsKey才能匹配到
                    listviewitemprocess.Name = pidStr;
                    listView1.Items.Add(listviewitemprocess);
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者TheLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:45:02