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;
}
}