有没有更好的方法来过滤这个数据网格视图

本文关键字:数据 数据网 网格 视图 过滤 更好 方法 有没有 | 更新日期: 2023-09-27 18:37:10

我有一个数据网格视图,它使用switch语句通过双击事件进行过滤。 数据源最初由基于用户输入的 LINQ to SQL 查询设置,然后可以选择双击单元格以筛选类似项目,例如型号、计算机名称或操作系统。

这里似乎有太多重复的代码。 关于更好的方法有什么想法吗?

private void gridInventory_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
        try
        {
            if (e.ColumnIndex > 0 && e.RowIndex > 0)
            {
                var cell = this.gridInventory[e.ColumnIndex, e.RowIndex];
                var clickedValue = (cell.Value != null) ? cell.Value.ToString() : string.Empty;
                if (!string.IsNullOrEmpty(clickedValue))
                {
                    switch (this.gridInventory.Columns[e.ColumnIndex].Name.ToUpper())
                    {
                        case @"MODEL":
                            CurrentList = CurrentList.Where(r => r.Model != null && r.Model.ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"COMPUTERNAME":
                            CurrentList = CurrentList.Where(r => r.ComputerName != null && r.ComputerName.ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"SERIALNUMBER":
                            CurrentList = CurrentList.Where(r => r.SerialNumber != null && r.SerialNumber.ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"COMPUTERID":
                            CurrentList = CurrentList.Where(r => r.ComputerID.ToString().ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"MANUFACTURER":
                            CurrentList = CurrentList.Where(r => r.Manufacturer != null && r.Manufacturer.ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"OSVERSION":
                            CurrentList = CurrentList.Where(r => r.OSVersion != null && r.OSVersion.ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"AUDITDATE":
                            CurrentList = CurrentList.Where(r => r.AuditDate != null && r.AuditDate.ToString().ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        case @"AUDITGUID":
                            CurrentList = CurrentList.Where(r => r.AuditGUID != null && r.AuditGUID.ToString().ToUpper() == clickedValue.ToUpper()).ToList();
                            break;
                        default:
                            break;
                    }
                    if (this.CurrentList != null)
                    {
                        gridInventory.DataSource = this.CurrentList;
                        this.lblRecords.Text = string.Format(@"Total Records: {0}", CurrentList.Count(c => c.ComputerID > 0));
                    }
                }
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message, @"error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

有没有更好的方法来过滤这个数据网格视图

使用 LINQ 和反射,可以通过以下方式重写此函数:

private void gridInventory_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
        try
        {
            if (e.ColumnIndex > 0 && e.RowIndex > 0)
            {
                var cell = this.gridInventory[e.ColumnIndex, e.RowIndex];
                var clickedValue = (cell.Value != null) ? cell.Value.ToString() : string.Empty;
                if (!string.IsNullOrEmpty(clickedValue))
                {
                    CurrentList = CurrentList.Where(r => typeof(r_type_here).GetProperty(this.gridInventory.Columns[e.ColumnIndex].Name).GetValue(r, null) != null &&
                        typeof(r_type_here).GetProperty(this.gridInventory.Columns[e.ColumnIndex].Name).GetValue(r, null).ToString().ToUpper() == clickedValue.ToUpper()).ToList();
                    if (this.CurrentList != null)
                    {
                        gridInventory.DataSource = this.CurrentList;
                        this.lblRecords.Text = string.Format(@"Total Records: {0}", CurrentList.Count(c => c.ComputerID > 0));
                    }
                }
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message, @"error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

r_type_here替换为CurrentList中实际类型的元素,您应该得到相同的结果。

优势:

  • 代码更短
  • 代码更灵活 - 如果你想添加新的列/属性,则无需编写任何代码这里

弊:

  • 您必须保持字符大小写 - 即列表元素类的属性名称中的大小写应与gridInventory.Columns中相应列的名称完全相同
  • 代码可读性较差
  • 如果您经常使用此函数,这可能会成为性能瓶颈 - 反射通常比您的 case 语句慢。

此外,还应在同一 LINQ where 语句中实现对属性的检查。