2012-06-13 69 views
3

我有一个使用switch语句通过双击事件过滤的datagridview。数据源最初是通过基于用户输入的LINQ to SQL查询设置的,然后他们可以选择双击单元格以筛选类似项目,例如模型,计算机名称或操作系统。有没有更好的方法来过滤这个datagridview?

这里似乎有太多重复的代码。有没有更好的方法来做到这一点?

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); 
     } 
    } 

回答

1

使用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); 
     } 
    } 

实际类型的元素从CurrentList更换r_type_here,你应该得到同样的结果。

优点:

  • 代码较短
  • 代码更灵活 - 如果要添加新的 列/属性,那么你将不需要写代码 一行这里

缺点:

  • 你必须保持人物的情况下 - 在列表元素类的属性名,即情况下应该有相应列的名称完全相等的情况下在gridInventory.Columns
  • 的可读性代码
  • 如果使用此功能,经常可能成为性能瓶颈 - 反映速度通常比您的案例陈述慢。

此外,还应该在相同的LINQ where声明中执行检查是否存在缺陷。

+0

谢谢!这很好。我喜欢这个代码提供的灵活性,因为我们将来最喜欢添加列。至于案例问题,属性名称和列名都来自同一个数据源,所以不应该是一个问题。再次感谢你。 – bzsparks

相关问题