2016-05-16 9 views
2

私は数日間このホイールを回転させています!アイテムが重複していない場合にのみListViewにアイテムを追加する

プロセス名(この例では "notepad")で現在実行中の特定のプロセスのMainWindowTitleをListViewに追加しようとしています。私はどのように項目を作成して追加するかを考え出しましたが、今はListViewに複製があります。だから私がしようとしているのは、ListViewにアイテムを追加するだけです。ListViewにアイテムが存在しない場合は、ListViewにアイテムを追加するだけです。

関連情報:

-Thereが、私は(1から9まで)からMainWindowTitleを捕獲しようとしている同じプロセスの倍数になりますが、彼らはそれぞれが固有のIDを持っています。

- 各MainWindowTitleは、ここで私がこれまで持っているものだ

異なるだろう、私は、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); 
      } 

EDIT2:クローサー、私は願って、まだ追加の重複

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

答えて

0

私は、このコードのために働いていないと考えることができる唯一の理由ListViewItemがequals演算子をオーバーロードしないということです。これが当てはまる場合、Containsを呼び出すと、新しいオブジェクトを作成したためにオブジェクトが同じオブジェクトではないかどうかがチェックされます。一意性を保証するために、Containsではなくlinq Any関数を使用します。 Linq Anyは、指定された条件に一致する要素があるかどうかを調べます。

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

残念ながら、 'ItemCollection'には 'Any'の定義が含まれていないとの意見がありました。 –

+0

あなたは 'System.Linq;を使用していますか? 'Linq関数では、usingステートメントを使用する必要があります。 –

+0

はい、System.Linqを使用します。 まだ新しいプログラマーで、C#の新機能ですが、.containsは 'オブジェクト'を呼び出すようですが、その理由はAnyが使えない理由です。 –

0

実際には、ProcessオブジェクトをListViewItemのDataContextとして使用できます。次に、Process.Idを使用して、アイテムがすでに追加されているかどうかを確認します。

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

例を非常に感謝しています。上記の情報 –

+0

サンプルを追加しました。 – tgpdyk

+0

まだC#には非常に新しい、これは有望に見えますが、私はこれを使用する方法がわかりません。いくつかの行をこれに置き換えるか、これは新しいif文でなければなりませんか? また、 'theProcess'は自分のコードに関して何を表していますか? 本当にありがとうございます! –

1

のではなく、手動でアイテムをListViewを移入表示したいユニークなウィンドウのタイトルが含まれているObservableCollection<string>を作成します。次に、ListView.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); 
    } 
} 

UI XAML

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

UIコード WHE

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

の後ろMainWindowにはXAMLにListView UI XAMLチャンクが含まれているものとします。これは私があなたが探していると思う結果を示しています。基本的には、ビューモデルにユニークなものを追加したりビューの外に追加するロジックを移動しました。これはあなたの質問にあるように、ロジックを簡単に実装できます。

関連する問題