2016-02-11 100 views
0

我知道已經在這裏有一個問題,關於搜索ListView中的子項,但它是一個有點複雜了像我這樣的新手。我做了一個簡單的Windows窗體應用程序與列表視圖,並在列表視圖內有2列命名:'名稱'和'年齡'。我設法搜索子項目,但它首先搜索第一列中的項目,然後搜索子項目。下面的代碼:搜索子項目在列表視圖

private void btnSearch_Click(object sender, EventArgs e) 
{ 

    for (int i = 0; i <=listView1.Items.Count-1; i++) 
     { 
      foreach(ListViewItem.ListViewSubItem subitem in listView1.Items[i].SubItems) 
      { 
       if (subitem.Text.Equals(txtSearch.Text)) 
       { 
        MessageBox.Show("Subitem found!"); 
       } 
       else 
       { 
        MessageBox.Show("Subitem not found!"); 
       } 
      } 
     } 
} 

(假定名稱: '約翰' 和年齡:在ListView '17' )

輸入:

txtSearch:17

輸出:未找到

子項目! //因爲它首先搜索第一列(這是約翰)

子項目找到了! //因爲現在檢測到的子項

如果我刪除「MessageBox.Show(」子項未找到!「)」,並輸入正確的輸入着,當然它會顯示它已經找到了項目,但如果我輸入一個不正確的輸入它不會做任何事情。 任何想法如何直接搜索子項目?謝謝。

+1

可能的重複[嘗試搜索ListView以匹配字符串的子項目](http://stackoverflow.com/questions/17974592/trying-to-search-listview-for-subitems-matching-a-string) –

回答

1

有幾種方法,你可以處理這個,第一個(長手)是一個輕微的改動,當前的方法。

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    var isResultFound = false; 
    for (int i = 0; i <=listView1.Items.Count-1; i++) 
    { 
     foreach(ListViewItem.ListViewSubItem subitem in listView1.Items[i].SubItems) 
     { 
      if (subitem.Text.Contains(txtSearch.Text)) 
      { 
       isResultFound = true; 
       break; 
      } 

     } 
     if(isResultFound) break; 
    } 

    if(isItemFound) 
    { 
     MessageBox.Show("Found!"); 
    } 
    else 
    { 
     MessageBox.Show("Not found!"); 
    } 

另一種方法是使用Linq查詢項目。

private void btnSearch_Click(object sender, EventArgs e) 
{ 
    var isResultFound = listView1.Items.Any(i=> 
       i.SubItems.Any(si=> 
        si.Text.Contains(txtSearch.Text))); 

    if(isItemFound) 
    { 
     MessageBox.Show("Found!"); 
    } 
    else 
    { 
     MessageBox.Show("Not found!"); 
    } 

這個新的Linq Expression實際上和for循環做的是一樣的,只是以一個更簡潔的方式。

這兩個例子都將停止搜索值的第一次出現後發現周圍的迭代循環。

我也用包含選項,而不是等於找到結果,其中的條目是值的範圍內,例如在一個句子。


編輯:肯的鏈接在他的評論是另一個選項可供你使用。