C# WinForm开发任务管理器时ListView添加进程出现重复条目如何解决
问题根因
- 你每次触发鼠标抬起事件时,仅清空了自己定义的
processId列表,没有清空ListView控件中已经存在的旧条目,每次点击都会把全量进程ID重新插入ListView,自然会出现重复。 - 你创建ListViewItem时仅设置了
Text属性,没有给Name属性赋值,而ListView.Items.ContainsKey()方法是通过匹配项的Name属性判断是否存在的,即使你写了相关去重逻辑也无法生效。 - 你编写的
do_job去重方法没有被任何代码调用,写好的去重逻辑完全没有执行。
修复方案
你可以选择两种实现方式,根据你的需求选即可:
- 全量刷新方案(适合定时更新进程列表的场景,逻辑最简单):每次加载进程前先清空ListView所有现有项,再插入最新的进程列表
- 增量去重方案:每次加载时仅插入不存在的新进程,已有的进程条目保留
修正后代码示例(全量刷新版本)
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
相关产品推荐
相关产品推荐

