2014-01-06 33 views
0

我正在C#中使用ListView控件創建應用程序,該控件允許您創建列表。我正在使用Find()方法實現查找功能。這裏是我的代碼:在C中爲ListView實現查找系統#

if (findTextBox.Text != "") 
{ 
    ListViewItem[] lviFoundList = listItemsList.Items.Find(findTextBox.Text, true); 
    amountFound.Text = "Found " + Convert.ToString(lviFoundList.Count()); 
    if (lviFoundList.Count() != 0) 
    { 
     int firstItemIndex = lviFoundList[0].Index; 
     listItemsList.Items[firstItemIndex].Selected = true; 
    } 
} 
else 
{ 
    amountFound.Text = "Found 0"; 
} 

但是,它不返回任何匹配。我究竟做錯了什麼?

+2

什麼短信,您在搜索的,而對於什麼樣的價值觀[ 'ListViewItem'的'.Name'屬性](http://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem.name%28v=vs.110%29.aspx)你有沒有?另外,你是否已經調試並檢查了你正在輸入的分支(從我上面看到的,你不知道是否輸入空字符串分支,或輸入的文本,但沒有搜索結果分支)有一個錯誤的查找錯誤的'findTextBox'輸入,它總是評估爲空,因此從不搜索? –

+0

是的,你是物品鍵的searchig,而不是實際的文字。請參閱:http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.listviewitemcollection.find(v=vs.110).aspx –

回答

2

Find方法需要你的ListView項的名稱,你設置你的列表視圖項的name property?如果您想搜索文本您可以使用此:

var lviFoundList = new List<ListViewItem>(); 
foreach(var item in listItemsList.Items) 
{ 
    if(item.Text == findTextBox.Text) lviFoundList.Add(item); 
} 
0

的find()方法着眼於ListViewItem的名字,而不是它的文本。

希望此相反:

if (findTextBox.Text != "") 
{ 
    List<ListViewItem> items = new List<ListViewItems>(); 
    foreach ListViewItem lvi in listItemsList.Items 
    { 
     if (lvi.Text == findTextBox.Text) 
      items.Add(lvi); 
    } 

    amountFound.Text = "Found " + Convert.ToString(lviFoundList.Count()); 

    if(lviFoundList.Count() != 0) 
    { 
     int firstItemIndex = lviFoundList[0].Index; 
     listItemsList.Items[firstItemIndex].Selected = true; 
    } 



} 
else 
{ 
    amountFound.Text = "Found 0"; 
} 
0

老實說,在ListView.Find()方法是比較差的,它更容易使用LINQ滾你自己。想一想Find真的在努力完成什麼 - 一個特定的過濾,通常是一個記錄。

第一步,如果你還沒有,將是保持你的數據對象的緩存集合。讓我們假設你有Person類的列表,像這樣:

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string JobTitle { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

那麼你MainForm你必須定義爲List<Person>一個ListView和成員變量people。您的ListView.Items應反映此List<Person>的內容。

所以,現在也許你想找到一個基於他們的人FirstNameLastName,對不對?你可以在一個函數中使用LINQ像這樣:

int FindFirstIndexOfPersonNamed(string firstOrLastName) 
{ 
    // WARNING: This is case sensitive! 
    return people.FindIndex(p => p.FirstName.Contains(firstOrLastName) || p.LastName.Contains(firstOrLastName)); 
} 

由於您ListView.Items應該反映你的List<Person>index應該是相同的:

// Get the found item and do whatever you want with it... 
var selectedListViewItem = listView.Items[index];