2016-05-16 16 views
2

Ich habe meine Räder an diesem Tag gedreht!Artikel nur dann zu ListView hinzufügen, wenn der Artikel kein Duplikat ist

Versucht, die MainWindowTitle eines bestimmten derzeit laufenden Prozesse nach Prozessnamen, in diesem Beispiel "notepad", zu einem ListView hinzuzufügen. Ich habe herausgefunden, wie man das Element erstellt und hinzufügt, aber jetzt habe ich Duplikate in meinem ListView. Also versuche ich nur ein Element zu meiner ListView hinzuzufügen, wenn es nicht bereits als exakter Eintrag in meiner ListView existiert.

Relevante Informationen:

-Es wird mehrere der gleichen Prozesse sein, dass ich die Mainwindowtitle aus zu erfassen versuchen (1 bis 9), aber sie haben jeweils eine eindeutige ID.

-Jeder Mainwindowtitle wird anders sein, ist

Hier ist, was ich bisher habe, kann ich nicht LINQ Arbeit zu machen und ich bin nicht sicher, ob es wäre ein Weg, um eine foreach-Schleife, um Duplikate zu vermeiden.

Ich freue mich über jede Hilfe!

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

Edit 1: Still Hinzufügen doppelte Elemente

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

Edit2: Näher, hoffe ich, noch das Hinzufügen von Duplikaten

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

Antwort

0

Der einzige Grund, warum ich für diesen Code denken kann, funktioniert nicht ist, dass ListViewItem den Gleichheitsoperator nicht überlädt. Wenn dies der Fall ist, dann prüft beim Aufruf von Contains, ob die Objekte das gleiche Objekt sind, was nie der Fall ist, weil Sie gerade das neue Objekt erstellt haben. Um die Eindeutigkeit zu gewährleisten, würde ich die linq Any-Funktion anstelle von Contains verwenden. Linq Any prüft, ob es Elemente gibt, die der gegebenen Bedingung entsprechen.

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

Vielen Dank für den Gedanken, jemand in einem anderen Forum hatte vorgeschlagen, dass "ItemCollection" leider keine Definition für "Any" enthält. –

+0

Verwenden Sie "System.Linq;" Linq Funktionen erfordern die Verwendung von Anweisung zu arbeiten. –

+0

Ja, mit System.Linq; Immer noch ein neuer Programmierer insgesamt, und neu zu C#, aber .contains scheint ein "Objekt" zu nennen und ich glaube, dass deshalb Any ist unbrauchbar –

0

Sie können Process-Objekt tatsächlich als DataContext des ListViewItem verwenden. Verwenden Sie dann Process.Id, um zu überprüfen, ob das Element bereits hinzugefügt wurde.

var item = listview.Items.Cast<ListViewItem>().ToList().Where(x => x.DataContext == theProcess); 
+0

Ich würde sehr ein Beispiel schätzen, ich bin nicht in der Lage, die if-Anweisung mit dem zu stolpern obige Information –

+0

Ich habe Probe hinzugefügt. – tgpdyk

+0

Immer noch sehr neu in C#, das sieht vielversprechend aus, obwohl ich mir nicht sicher bin, wie ich das verwenden soll. Tausche ich einige Zeilen damit, oder sollte das meine neue if-Anweisung sein? Was bedeutet "theProcess" auch in Bezug auf meinen Code? Ich schätze Ihre Hilfe sehr! –

1

Anstatt manuell ListView mit Elementen bevöl schaffen eine ObservableCollection<string>, die die einzigartigen Fenstertitel enthält, die Sie anzeigen möchten. Setzen Sie dann die ListView.ItemsSource auf diese Eigenschaft. Achten Sie bei dieser Backing-Sammlung darauf, nur etwas hinzuzufügen, wenn es eindeutig ist. So etwas wie folgt aus:

Ansicht Modell

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

UI XAML

<ListView ItemsSource="{Binding WindowTitles}"/> 

UI-Code Hinter

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

Whe Es wird angenommen, dass die MainWindow den ListView UI XAML-Chunk in seinem XAML enthält. Dies zeigt das Ergebnis, das Sie suchen.Im Grunde habe ich die Logik des Hinzufügens, wenn einzigartig, zurück zum Ansichtsmodell und aus der Sicht, wie Sie es in Ihrer Frage haben, bewegt, macht das Implementieren der Logik einfacher.

Verwandte Themen