Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当项目不是重复项时才将项目添加到ListView_C#_.net_Wpf_Winforms - Fatal编程技术网

C# 仅当项目不是重复项时才将项目添加到ListView

C# 仅当项目不是重复项时才将项目添加到ListView,c#,.net,wpf,winforms,C#,.net,Wpf,Winforms,我已经在这上面转了好几天了 正在尝试按进程名称将当前正在运行的特定进程的MainWindowTitle(在本例中为“记事本”)添加到列表视图中。我已经知道如何创建和添加该项,但现在我的ListView中有重复项。因此,我要做的只是在我的ListView中添加一个项目,如果它在我的ListView中不存在的话 有关资料: -将有多个相同的进程,我正试图从中捕获MainWindowTitle(从1到9),但每个进程都有一个唯一的ID -每个主窗口标题都将不同 到目前为止,我已经知道了,我不能让LIN

我已经在这上面转了好几天了

正在尝试按进程名称将当前正在运行的特定进程的
MainWindowTitle
(在本例中为“记事本”)添加到列表视图中。我已经知道如何创建和添加该项,但现在我的ListView中有重复项。因此,我要做的只是在我的ListView中添加一个项目,如果它在我的ListView中不存在的话

有关资料:

-将有多个相同的进程,我正试图从中捕获MainWindowTitle(从1到9),但每个进程都有一个唯一的ID

-每个主窗口标题都将不同

到目前为止,我已经知道了,我不能让LINQ工作,我也不确定是否有办法创建foreach循环来防止重复

谢谢你的帮助

Process[] processList = Process.GetProcessesByName("notepad");
    foreach (Process process in processList)
    {
        ListViewItem item = new ListViewItem();
        item.Content = process.MainWindowTitle;
        item.Tag = process;

        if (listView.Items.Contains(item))
        {
            MessageBox.Show("Duplicate");
        }
        else
        {
            MessageBox.Show("New Item!");
            listView.Items.Add(item);
        }
编辑1:仍在添加重复项

        Process[] processList = Process.GetProcessesByName("notepad");
        foreach (Process process in processList)
        {
            ListViewItem item = new ListViewItem();
            item.Content = process.MainWindowTitle;

            item.DataContext = process;

            var itemz = listView.Items.Cast<ListViewItem>().ToList().Where(x => x.DataContext == process);

            if (listView.Items.Contains(itemz))
            {
                MessageBox.Show("Duplicate");
            }
            else
            {
                MessageBox.Show("New Item!");
                listView.Items.Add(item);
            }
Process[]processList=Process.getProcessByName(“记事本”);
foreach(进程列表中的进程)
{
ListViewItem=新建ListViewItem();
item.Content=process.MainWindowTitle;
item.DataContext=进程;
var itemz=listView.Items.Cast().ToList()。其中(x=>x.DataContext==process);
if(listView.Items.Contains(itemz))
{
MessageBox.Show(“复制”);
}
其他的
{
显示(“新项目!”);
listView.Items.Add(item);
}
编辑2:我希望更接近,仍然添加重复项

        Process[] processList = Process.GetProcessesByName("notepad");
        foreach (Process process in processList)
        {
            ListViewItem item = new ListViewItem();
            item.Content = process.MainWindowTitle;

            item.DataContext = process;

            var itemz = listView.Items.Cast<ListViewItem>().ToList().Where(x => (x.DataContext as Process).Id == process.Id);

            if (itemz == null)
            {
                MessageBox.Show("Duplicate");
            }
            else
            {
                MessageBox.Show("New Item!");
                listView.Items.Add(item);
            }
        }
Process[]processList=Process.getProcessByName(“记事本”);
foreach(进程列表中的进程)
{
ListViewItem=新建ListViewItem();
item.Content=process.MainWindowTitle;
item.DataContext=进程;
var itemz=listView.Items.Cast().ToList().Where(x=>(x.DataContext作为进程)。Id==Process.Id);
if(itemz==null)
{
MessageBox.Show(“复制”);
}
其他的
{
显示(“新项目!”);
listView.Items.Add(item);
}
}

我能想到的这段代码不起作用的唯一原因是ListViewItem没有重载equals运算符。如果是这种情况,那么在调用Contains时,它会检查对象是否是同一个对象,因为您刚刚创建了一个新的对象。为了确保唯一性,我将使用linq Any函数of Contains.Linq检查是否有与给定条件匹配的元素

if (listView.Items.Contains(item))//replace this
if(listView.Items.Any(x=>x.Content == item.Content))//with this 

实际上,您可以使用Process对象作为ListViewItem的DataContext。然后,使用Process.Id检查是否已添加该项

var item = listview.Items.Cast<ListViewItem>().ToList().Where(x => x.DataContext == theProcess);
var item=listview.Items.Cast().ToList()。其中(x=>x.DataContext==进程);

创建一个包含要显示的唯一窗口标题的
ObservableCollection
,而不是手动将项目填充到
列表视图中。然后将
列表视图.ItemsSource
设置为此属性。在此备份集合上,只需确保仅添加不同的内容。因此像这样:

查看模型

public class ValuesViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<string> WindowTitles { get; private set; }

    public ValuesViewModel()
    {
        WindowTitles = new ObservableCollection<string>();
    }

    public void AddTitleIfUnique(string title)
    {
        if (!WindowTitles.Contains(title))
            WindowTitles.Add(title);
    }
}

其中,
main窗口
假定在其XAML中包含
ListView
UI XAML块。这显示了我认为您正在寻找的结果。基本上,我已将添加if unique的逻辑移回视图模型,并将其移出视图,就像您的问题一样,这使得实现逻辑更简单。

谢谢考虑到这一点,另一个论坛上有人提出,不幸的是,“ItemCollection”不包含“Any”的定义。您是否
使用System.Linq;
Linq函数需要使用该语句才能工作。是的,使用System.Linq;总体来说还是一个新的程序员,对c#来说还是个新手,但是.contains似乎调用了“object”,而我是lieve这就是为什么Any是不可用的我非常感谢一个例子,我无法用我添加的示例中的上述信息来遍历if语句。对于c#来说,这仍然是非常新的,但看起来很有希望,尽管我不确定如何使用它。我是用它替换一些行,还是这应该是我的新if语句?还有,“进程”是什么与我的代码相关的演示?我非常感谢您的帮助!我只是更喜欢DataContext而不是代码中的标记。但是这个想法与您在使用“if”之前的想法相同。现在,当您检查它是否存在时,请使用我的示例。这次,使用流程对象的ID。项(来自var项=…)如果它不存在,将返回null。我想我还没有完全理解这个概念:请参见编辑1
<ListView ItemsSource="{Binding WindowTitles}"/>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var viewModel = new ValuesViewModel();
        viewModel.AddTitleIfUnique("Testing");
        viewModel.AddTitleIfUnique("Testing Again");
        viewModel.AddTitleIfUnique("Testing Again");
        DataContext = viewModel;
    }
}