循环访问绑定列表以查找属性

本文关键字:查找 属性 列表 访问 绑定 循环 | 更新日期: 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,所有行仍然变为红色。