C# LINQ:如何检查列表框项的对象值并相应地设置颜色

本文关键字:对象 颜色 设置 何检查 LINQ 列表 检查 | 更新日期: 2023-09-27 17:57:16

我想知道这是否可能。下面是填充列表框的代码:

var allHolds =
                from a in db.Record_HoldDatas
                join f in db.LUT_Flavors on a.Flavor equals f.ID
                into flavorNames
                where a.HoldStatus == "Open"
                from grouped in flavorNames
                select new { a.HoldID, a.DateOpened, grouped.flavor, a.NonConformingItem, 
                Caption = a.HoldID + " - " + a.Package + " " + grouped.flavor };
            lbxHoldCaption.DataSource = allHolds;
            lbxHoldCaption.DisplayMember = "Caption";

我想做的是编写一个循环,该循环遍历列表框中的每个对象,并使用几个值来执行一些数学运算。如果数学结果是某个值,那么我希望它更改该项目的背景颜色。

我不确定如何使用 foreach 循环。由于列表框实际上绑定到一个充满匿名类型的引用

更具体地说,这就是我正在做的事情:从查询返回的对象中的一个值是日期时间"DateOpened"我想用它减去今天的日期时间来确定经过的小时数。我正在使用这样的东西

DateTime now = DateTime.Now;
DateTime then = //retrieved from query object
TimeSpan span = now - then;

我希望用类似的东西来做这整件事

foreach(Object obj in allHolds)
{
     then = obj.DateOpened;
     span = now - then;
     if(span.TotalHours >= 48)
     {
          obj.BackColor = Color.Red;
     }
}

但显然这是行不通的,因为引用都是无聊的。有人可以帮助我吗?

C# LINQ:如何检查列表框项的对象值并相应地设置颜色

试试这个

var allHolds =
            from a in db.Record_HoldDatas
            join f in db.LUT_Flavors on a.Flavor equals f.ID
            into flavorNames
            where a.HoldStatus == "Open"
            from grouped in flavorNames
            select new { a.HoldID, a.DateOpened, grouped.flavor, a.NonConformingItem, 
            Caption = a.HoldID + " - " + a.Package + " " + grouped.flavor, 
            BackColor = (DateTime.Now - a.DateOpened).TotalHours >= 48 ? "Red" : "Blue" };

        lbxHoldCaption.DataSource = allHolds;
        lbxHoldCaption.DisplayMember = "Caption";
        lbxHoldCaption.DataBindings.Add("BackColor", allHolds,"BackColor");
foreach (ListItem xx in ListBox1.Items)
    {
        if (Convert.ToInt32(xx.Value) == 3)
        {
            xx.Attributes["style"] = "background-color:red;";
        }
     }

不要忘记ListBox的那些属性:DataTextField="Caption" DataValueField="DateOpened"

很简单,使用 var 关键字,这样你就不需要显式指定类型了。

foreach(var obj in allHolds)
{
     then = obj.DateOpened;
     span = now - then;
     if(span.TotalHours >= 48)
     {
          obj.BackColor = Color.Red;
     }
}