C # LINQ: Как проверить значение объекта элемента списка и соответственно установить цвет - PullRequest
2 голосов
/ 21 мая 2011

Мне было интересно, возможно ли это. Вот код, который заполняет список:

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 с этим. Поскольку список действительно привязан к ссылке, полной анонимных типов

Более конкретно, это то, что я делаю: Одним из значений в объекте, возвращаемом из запроса, является datetime «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;
     }
}

но, очевидно, это не сработает, потому что все ссылки не выполняются. Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 22 мая 2011
foreach (ListItem xx in ListBox1.Items)
    {

        if (Convert.ToInt32(xx.Value) == 3)
        {

            xx.Attributes["style"] = "background-color:red;";

        }
     }

не забывайте об этих свойствах ListBox: DataTextField = "Caption" DataValueField = "DateOpened"

1 голос
/ 23 мая 2011

Просто, используйте ключевое слово var, так что вам не нужно явно указывать тип.

foreach(var obj in allHolds)
{
     then = obj.DateOpened;
     span = now - then;

     if(span.TotalHours >= 48)
     {
          obj.BackColor = Color.Red;
     }
}
1 голос
/ 21 мая 2011

попробуйте

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...