2012-06-13 5 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)) 
       { 
        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를 교체하고 동일한 결과를 얻을해야 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)) 
       { 
        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

이 방법을 쓸 수있다.

장점 :

  • 코드
  • 코드가 더 유연 짧은 - 당신은 당신이 여기에 코드 의 한 줄을 쓸 필요가 없습니다 새 열/속성을 추가하려면

단점 :

,
  • 당신은 대소 문자를 유지해야 - 목록 요소 클래스의 속성 이름의 예 경우 gridInventory.Columns
  • 적은 읽을 수있는 코드에서 해당 컬럼의 이름과 정확히 동일한 경우이 있어야합니다
  • 이 기능을 사용하면 자주 그것이 될 수도 성능 병목 현상 - 반영은 일반적으로 사례 명세서보다 느립니다.

또한하게 proprty의 exsitence에 대한 검사가 같은 LINQ where 문에서 구현되어야한다.

+0

감사합니다. 이것은 잘 작동합니다. 나는이 코드가 제공하는 유연성을 좋아한다. 우리가 장래에 열을 추가하는 것을 가장 좋아할 것이기 때문이다. 이슈의 경우 속성 이름과 열 이름은 동일한 데이터 소스에서 파생되므로 문제가 될 수 없습니다. 다시 감사합니다. – bzsparks

관련 문제