【发布时间】:2018-05-22 17:50:17
【问题描述】:
我目前不确定让过滤器在数据源设置为对象列表的 datagridview 上正常工作的最佳方法。
所以给定一个对象:
public class DepositAccountBill
{
#region Properties
public int AccountBillID { get; set; }
public int AccountID { get; set; }
public string AccountNumber { get; set; }
public string ControlNumber { get; set; }
public DateTime BillDate { get; set; }
public decimal DepositAmount { get; set; }
}
我有一个大致如下所示的 datagridview 表:
Account Number | Control Number | Bill Date | Deposit Amount
==================================================================
123456 | AJA1234367 | 5/21/2018 | 12.99
123456 | PSA1234367 | 5/21/2018 | 5.77
567332 | HBA1234367 | 5/21/2018 | 1255.99
769843 | AJA1234367 | 5/21/2018 | 12.99
所以当点击一个单元格时。让我们说第一列的第一个单元格。如果我右键单击一个单元格并在上下文菜单中选择一个显示过滤器的选项,我需要显示只有具有相同帐号的行的 datagridview 表。在这种情况下,它将是第 1 行和第 2 行。 为了让我这样做,我必须访问 datagridview 表中填充有 DepositAccountBill 的对象。所以我需要做的是查看并查看我正在查看的列具有所选单元格的值。
所以在我的方法中,到目前为止我尝试过没有结果:
var collection = (List<DepositAccountBill>)dataGridView1.DataSource;
var filterList = collection.Where ( q => (collection.Select(r => GetPropValue(r, dataGridView1.Columns[clickedCell.ColumnIndex].DataPropertyName))) == (clickedCell.Value);
dataGridView1.DataSource = filterList.ToList();
public object GetPropValue(object obj, string propName)
{
return obj.GetType().GetProperty(propName).GetValue(obj, null);
}
我不知道 SELECT 是否是在这里使用的正确 LINQ 方法,或者这是否可能。 我想使用 WHERE 因为它只获取与条件匹配的对象列表。像这样的:
var filterList = collection.Where(r => r.AccountNumber == clickedCell.Value);
唯一的问题是r.AccountNumber 依赖于所选列的数据属性。程序不知道基于所选单元格上的单击事件的数据属性是什么。这就是为什么我认为反思可能是必要的。
【问题讨论】:
-
你在什么情况下处理上面的代码?
-
我正在处理来自所选单元格上的右键单击事件 (CellMouseUp) 的事件。
标签: c# .net winforms linq reflection