2017-03-05 65 views
3

在我的程序中,我有2個列表視圖和1個按鈕。 當我按下按鈕時,第一個列表視圖中的每個列表視圖項目都將在第二個列表視圖中被選中(並且該項目始終存在於第二個列表視圖中)。c#如果兩個列表視圖包含它,請選擇listview項目

我在選擇項目時遇到問題,因爲第一個和第二個listview中的索引不是相同的項目。所以我試圖用IndexOf得到索引。

foreach (ListViewItem item in firstListView.Items) 
{ 
    int index = secondListView.Items.IndexOf(item); 
    secondListView.Items[index].Selected = true; 
    secondListView.Select(); 
} 

我總是得到一個錯誤,index-1當我點擊按鈕。我不明白我做錯了什麼。

編輯:

的列表視圖具有8列。第一列文本通常爲0 而我只能使用IndexOf作爲第一列。但我想檢查所有列。我已經找到了一個很好的解決方案。

感謝大家誰試圖幫助。

+0

當debbuging什麼行導致錯誤? – Whencesoever

+0

'secondListView.Items [index] .Selected = true;'它表示值'-1'無效 – Latif

+0

*我已經找到了一個很好的解決方案... *所以你可以添加你自己的答案,如果它比現有的更好答案。 –

回答

1

可以使用這樣的LINQ查詢,選擇存在於第一個列表太第二列表的項目:

var items = from i1 in listView1.Items.Cast<ListViewItem>() 
      from i2 in listView2.Items.Cast<ListViewItem>() 
      where i1.SubItems.Cast<ListViewItem.ListViewSubItem>() 
        .Where((s, i) => s.Text != i2.SubItems[i].Text).Count() == 0 
      select i2; 
items.ToList().ForEach(x => { x.Selected = true; }); 

注: 當嘗試使用secondListView.Items.IndexOf方法找到屬於一個項目到firstListView你不能指望它找到該項目。您嘗試查找其索引的項目不存在於第二個listview的項目集合中。您應該使用項目和子項目的Text屬性來查找項目。

+0

'Text'屬性只獲取該行第一列的文本。我需要檢查整行,因爲一些信息可能是相同的。所以'IndexOf'永遠不會工作。現在我知道了。 – Latif

+0

然後你需要一個更好的標準'where'。查看編輯。 –

0

如果IndexOf在列表中找不到傳遞給它的對象,則返回-1。我的猜測是你的平等比較存在問題。列表中的對象是否實現了IComparable?否則,他們可能不會正確地找到這些項目,並且正在恢復到錯誤的平等比較。 ListViewItem可能不會比較你的期望。

1

那麼同樣的項目顯然不能存在於兩個不同的列表中。

如果文字是一樣的,那麼嘗試尋找通過它:

foreach (ListViewItem listViewItem in l1.Items) 
{ 
    var item = l2.Items.Cast<ListViewItem>().Where(lvi => lvi.Text == listViewItem.Text); 
    item.Selected=true; 
} 

或者:

foreach (ListViewItem listViewItem in l2.Items.Cast<ListViewItem>() 
    .Where(lvi => l1.Items.Cast<ListViewItem>().Any(lvi2 => lvi.Text == lvi2.Text)) 
{ 
    listVieItem.Selected=true; 
} 
0

,你可以嘗試通過查找文本中的項目,然後得到這樣

指數
foreach (ListViewItem item in firstListView.Items) 
     { 

      var itm = secondListView.FindItemWithText(item.Text); 
      int index = secondListView.Items.IndexOf(itm); 
      secondListView.Items[index].Selected = true; 
      secondListView.Select(); 
     } 

什麼FindItemWithText會做的是得到在secondListView這將是相同的名稱firstListViewIndexOf將獲得項目的索引中secondListView

編輯

這個解決方案是好的,當你有兩個列表,其項目是相同的,不包括在名稱否則,如果你的任何重複secondListView中有兩個項目FindItemWithText只會得到第一個項目。

+0

有一個小問題,因爲'FindItemWithText'會找到第一個以searchString開頭的項目。所以,如果第一個項目是'item100',並且他正在尋找'item1',它會發現'item100' –

相關問題