2013-07-31 47 views
3

我無法通過ListView掃描來查找與給定字符串匹配的子項目。這裏是我的代碼:試圖搜索ListView以匹配字符串的子項目

private void dateTimePicker1_ValueChanged(object sender, EventArgs e) 
    { 
     string date = datePicker.Value.ToShortDateString(); 
     int count = Program.booker.listView.Items.Count; 

     for (int i = 0; i < count; i++) 
     { 
      ListViewItem lvi = Program.booker.listView.Items[i]; 

      if (lvi.SubItems.Equals(date)) 
      { 
       MessageBox.Show("Found!", "Alert"); 
       Program.booker.listView.MultiSelect = true; 
       Program.booker.listView.Items[i].Selected = true; 
      } 
      else 
      { 
       MessageBox.Show("Nothing found for " + date, "Alert"); 
      } 
     } 
    } 

ListView控件位於布克形式,而我從過濾器類訪問它。我想搜索整個ListView的任何匹配我的日期字符串的項目。謝謝!

+0

這是WPF或Winforms?你的當前代碼又有什麼問題,它不起作用,拋出錯誤? –

+0

Winforms。而我的代碼不會工作。它只搜索ListView中的第一列,而不是子項。 –

+0

不應該循環遍歷每個項目的「子項目」並檢查所有項目嗎?我在想'lvi.SubItems.Equals(date)'試圖將一個指向一個集合的指針與一個日期相匹配,而這個日期總是假的。也許把'Equals'改成'Contains'? –

回答

3

您可以使用FindItemWithText方法。

ListViewItem searchItem = null; 
int index = 0; 
do 
{ 
    if (index < Program.booker.listView.Items.Count) 
    { 
     //true = search subitems 
     //last false param = no partial matches (remove if you want partial matches) 
     searchItem = Program.booker.listView.FindItemWithText(date, true, index, false); 
     if (searchItem != null) 
     { 
      index = searchItem.Index + 1; 

      //rest of code 
     } 
    } 
    else 
     searchItem =null; 

} while (searchItem != null); 
+0

太棒了,就是我在找的東西。但是,如果我有兩個日期匹配,只有一行被選中? –

+1

'FindItemWithText'方法只會得到第一個結果。你可以在循環中執行[this overload](http://msdn.microsoft.com/en-us/library/cxdakxef.aspx),找到一個之後更新'startIndex'。我已經更新了答案,但代碼未經測試(直接輸入到SO中),但希望儘可能給你一個想法。 – keyboardP

+0

編輯後的代碼讓我陷入無限循環。我認爲這是因爲'searchitem'一旦找到它的第一個實例就不會爲空。 –