界面上的DataGridView綁定數據List<StudentScore>,其中StudentScore有五個屬性:Name,Gender,Age,Major,Score.篩選的關鍵詞有兩個:Major和Score。
public class StudentScore { public string Name { get; set; } public string Gender { get; set; } public int Age { get; set; } public string Major { get; set; } public int Score { get; set; } }
要點一:根據界面傳遞的數據查找和篩選數據的方法,無非是查找控件的值,同時通過一些標記來匹配相應的屬性,來組合查找條件。個人喜歡用Tag和Text來保存這些值。
要點二:用Linq的Where子句可以很方便的從集合中篩選子句,麻煩的是組合Where的條件。
要點三:我們知道,Linq的查找語句可以多個Where條件組合查詢,那么只需要傳遞每個Where的Func<Object,bool>到Where就可以了。到此,我們就知道應該在控件的Tag屬性里面寫什么了。
rdo.Tag = x => x.Score > scoreGrade[scoreGrade.Count - 1];
再監視rdo的Click事件,Click事件觸發后,將rdo.Tag值賦予給類下的局部變量。
Func<StudentScore, bool> filterMajor = x => true, filterScore = x => true;
void Radio_Click(object sender, string key) { var radio = sender as RadioButton; if (radio == null || radio.Tag == null || !(radio.Tag is Func<StudentScore, bool>)) return; if (key == "major") filterMajor = radio.Tag as Func<StudentScore, bool>; else if (key == "score") filterScore = radio.Tag as Func<StudentScore, bool>; DoQuery();//同時觸發查詢事件,綁定新結果 }
rdo.Click += (a, b) => Radio_Click(a, key);
最后組合Where語句:
void DoQuery() { var search = datas.Where(filterMajor).Where(filterScore).ToList(); dataGridView1.DataSource = search; }
源代碼:FilterSearch.rar。運行環境.net 4.0