循环访问绑定列表以查找属性
本文关键字:查找 属性 列表 访问 绑定 循环 | 更新日期: 2023-09-27 18:35:52
我有一个名为bList的BindingList,它在GUI中使用。
public BindingList<SomeList> bList = new BindingList<SomeList>();
我正在尝试做的是通过检查 bList 中的属性来更改带有事件的 RowStyle。假设在 bList 中,我有 6 个具有多个属性的对象。我拥有的 bList 中的一个属性称为 isValid
,这是一个bool
,如果设置为 false,我将该行变为红色,否则该行将保持默认颜色。
如果它们>= 0
,我能够让所有行都变成红色.如何遍历bList
以查找blist
中每个对象的属性isValid
?
private void gridView_RowStyle(object sender, RowStyleIEventArgs e)
{
bool isValid = class.bList[0].isValid;
if (e.RowHandle >= 0)
{
if (isValid == false)
{
e.Appearance.BackColor = Color.Red;
}
}
}
应使用反射来获取对象的属性值。下面是一个适用于泛型绑定列表的示例函数。
用:
for (int i = 0; i < myList.Count; i++)
{
object val = null;
TryGetPropertyValue<SomeType>(myList, i, "isValid", out val);
bool isValid = Convert.ToBoolean(val);
// Process logic for isValid value
}
方法:
static private bool TryGetPropertyValue<T>(BindingList<T> bindingList, int classIndex, string propertyName, out object val)
where T : class
{
try
{
Type type = typeof(T);
PropertyInfo propertyInfo = type.GetProperty(propertyName);
val = propertyInfo.GetValue(bindingList[classIndex], null);
return val != null; // return true if val is not null and false if it is
}
catch (Exception ex)
{
// do something with the exception
val = null;
return false;
}
}
为了根据属性值更改行的颜色,应将该属性添加为隐藏列,然后使用该单元格的值来设置样式。
请参阅以下内容:如何基于列值更改行样式
对于您的问题:
private void gridView_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
{
string valid = gridView.GetRowCellValue(e.RowHandle, "isValid").ToString().ToLower();
if(valid == "true")
e.Appearance.BackColor = Color.Red;
}
添加隐藏列:在 GridView 中隐藏列,但仍获取值
我现在能够迭代BindingList
bList,因为我在试图找出迭代器的类型时遇到了一些其他继承问题。
foreach (SomeType item in bList)
{
if (e.RowHandle >= 0)
{
if (instance.isValid == false)
{
e.Appearance.BackColor = Color.Red;
}
else
{
e.Appearance.BackColor = Color.White;
}
}
}
为什么即使我找到具有属性isValid
的对象返回false
,所有行仍然变为红色。