gpt4 book ai didi

c# - 有没有更好的方法来过滤这个datagridview?

转载 作者:行者123 更新时间:2023-11-30 17:59:36 25 4
gpt4 key购买 nike

我有一个 datagridview,它使用 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 中元素的实际类型,您应该会得到相同的结果。

优点:

  • 代码更短
  • 代码更灵活——如果你想添加新的column/property 那么你就不需要写一行代码这里

缺点:

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

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

关于c# - 有没有更好的方法来过滤这个datagridview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com