2012-06-13 99 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

相關問題