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