2011-08-08 81 views
0

試圖篩選谷歌結果;沒有運氣。我想要做的是,給定TextBox中的一些文本:在我的DataGridView的任何列中搜索至少一個部分匹配,並讓該控件選擇第一行(將其顯示爲最上一行並將其突出顯示)它遇到了部分匹配。搜索DataGridView的匹配或部分匹配

這裏是我的數據源的DataGridView中的聲明,以及如何列組織:

var queryData = from va in xdoc.Descendants("language") 
        select new 
        { 
         StringID = va.Parent.Parent.Attribute("id").Value, 
         Language = va.Attribute("name").Value, 
         LanguageData = va.Element("value").Value, 
        }; 

     var organizedData = from x in queryData 
        group x by x.StringID into xg 
        select new 
        { 
         StringID = xg.Key, 
         English = xg.SingleOrDefault(x => x.Language == "ENGLISH_US").LanguageData, 
         Custom = xg.SingleOrDefault(x => x.Language == languageBox.SelectedItem.ToString()).LanguageData, 
        }; 

     mainView.DataSource = organizedData.ToList(); 

這裏是處理「搜索」按鈕的點擊功能的當前定義:

private void searchButton_Click(object sender, EventArgs e) 
    { 
     int currentIndex = mainView.CurrentRow.Index; 

     if (searchBox.Text.Length == 0) 
     { 
      mainView.CurrentCell = mainView[0,0]; 
      mainView.Focus(); 
      return; 
     } 
    } 
+0

可能重複的[篩選ŧ他的Linq查詢](http://stackoverflow.com/questions/6988865/filtering-this-linq-query) –

+1

嘗試在第一時間說出你的問題。花點時間吧。如果不是,請編輯它並不要轉貼。 –

+0

謝謝Henk,但是這些是兩個不同的問題。請嘗試更仔細地檢查被問到的問題,而不是簡單地假設跨問題的重複內容表示重複的問題。 –

回答

1

像這樣的東西可能讓你關閉:

string searchForText = "whatever"; 

DataGridViewRow rowFound = mainView.Rows.OfType<DataGridViewRow>() 
    .FirstOrDefault(row => row.Cells.OfType<DataGridViewCell>() 
     .Any(cell => ((dynamic)cell.Value).StringID.Contains(searchForText))); 

if (rowFound != null) { 
    mainView.Rows[rowFound.Index].Selected = true; 
    mainView.FirstDisplayedScrollingRowIndex = rowFound.Index; 
} 
+0

嗯,這是一個不錯的工作,但由於某些原因,它不會轉到其中第一列包含文本的行。順便謝謝你的回覆! –

+1

奇數。第一欄有什麼特別之處嗎?它是一個組合框或類似的東西嗎? –

+0

嗯,不。它是OP中Linq查詢的「StringID」匿名類型。另外,如果可能的話,連續點擊「搜索」按鈕應該將DataGridView的選定行推進到下一個潛在候選者。 –