【问题标题】:Can't prevent double entry c# listview无法防止双重输入 c# listview
【发布时间】:2021-11-22 19:38:46
【问题描述】:

我正在尝试编写任务管理器。

我的问题是,我在列表视图中添加了进程列表,但是 我找不到不重复输入的方法

这里是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Process_Manager
{
    public partial class Form1 : Form
    {
        List<int> processId = new List<int>();
        int first_time = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void do_job(List<int> test,int id)
        {
            for(int i = 0; i < test.Count; i++)
            {
                if(!listView1.Items.ContainsKey(Convert.ToString(id)))
                {
                    ListViewItem t = new ListViewItem(Convert.ToString(id));
                    listView1.Items.Add(t);
                }
            }
        }

        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
            Process[] process = Process.GetProcesses();

            foreach (Process t in process)
            {
                processId.Add(t.Id);
            }
            for(int i = 0; i < processId.Count; i++)
            {
                ListViewItem listviewitemprocess = new ListViewItem(Convert.ToString(processId[i]));
                listView1.Items.Add(listviewitemprocess);
            }
            processId.Clear();
        }
    }
}

我尝试使用列表,将数据添加到列表中,然后清除列表以获得没有 doublon 的新列表。 但这似乎行不通!

我真的被困住了!

【问题讨论】:

  • do_job 是从哪里调用的?
  • 每次点击listView1 时,当前进程ID 都会被添加到列表中已经存在的进程ID 中吗?您应该在每次调用listView1_MouseUp() 时清除listView1;然后可以将processId 设为局部变量,或者更好的是,将其消除并在foreach 循环中填充listView1

标签: c# .net winforms listview duplicates


【解决方案1】:

我看到一些步骤,您将项目添加到列表视图但从不删除任何项目。我建议创建一个仅用于使用当前集合更新列表视图的方法,我建议调用 listView1.Items.Clear();在添加集合之前。

可能是这样的:

using System.Linq;

private void UpdateListView()
{ 
    var newListViewItems =
        Process.GetProcesses().
            Select(p => new ListViewItem(p.Id.ToString())).
            ToArray();
    listView1.BeginUpdate();
    try
    {
        listView1.Items.Clear();
        listView1.Items.AddRange(newListViewItems);
    }
    finally
    {
        listView1.EndUpdate();
    }
}

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多