WinForms中实现绑定DataGrid的Wrestler冠军筛选功能
实现WinForms DataGrid筛选冠军选手功能
步骤1:保留原始完整数据集合
在窗体类中添加两个字段,分别存储所有选手数据和筛选后的结果,避免每次筛选都重新读取JSON文件:
// 窗体类的字段定义 private BindingList<Wrestler> _allWrestlers; private BindingList<Wrestler> _filteredWrestlers;
步骤2:修改Form_Load事件代码
将读取到的JSON数据存入原始集合,初始绑定全部数据:
private void Form_Load(object sender, EventArgs e) { var json = File.ReadAllText(_filePath); _allWrestlers = JsonConvert.DeserializeObject<BindingList<Wrestler>>(json); // 初始显示所有选手 dataGridView1.DataSource = _allWrestlers; }
步骤3:添加「筛选冠军」按钮的点击事件
- 在窗体上拖放一个
Button控件,设置其Text为「筛选冠军」,命名为btnFilterChampions - 双击按钮生成点击事件,添加筛选逻辑:
private void btnFilterChampions_Click(object sender, EventArgs e) { // 使用Linq筛选Title属性不为"None"的选手 var filteredItems = _allWrestlers.Where(wrestler => wrestler.Title != "None").ToList(); // 将筛选结果转为BindingList并绑定到DataGrid _filteredWrestlers = new BindingList<Wrestler>(filteredItems); dataGridView1.DataSource = _filteredWrestlers; }
步骤4:可选:添加「显示全部」按钮(恢复原始数据)
如果需要切换回显示所有选手,重复步骤3添加另一个按钮,命名为btnShowAll,点击事件代码:
private void btnShowAll_Click(object sender, EventArgs e) { // 重新绑定原始完整数据集合 dataGridView1.DataSource = _allWrestlers; }
说明
- 原有的
CellClick事件代码无需修改,因为无论是全部数据还是筛选后的数据,DataBoundItem依然是Wrestler对象,标签更新逻辑保持有效 - 如果JSON中
Title的取值存在大小写差异(比如"none"小写),可以把判断条件改为wrestler.Title?.ToLower() != "none"(加?避免空引用异常)
内容的提问来源于stack exchange,提问作者Braden Putt
相关产品推荐
相关产品推荐

