Возможно, это не лучший способ, но вы можете обработать событие DataBound
в подробном представлении, получить ссылку на каждый из элементов управления, а затем изменить их цвет в зависимости от значения.
Это грубый пример:
Ваш бизнес-объект:
public class BusinessObject
{
public decimal ValueOne { get; set; }
public decimal ValueTwo { get; set; }
public decimal ValueThree { get; set; }
public decimal ValueFour { get; set; }
public decimal ValueFive { get; set; }
}
Разметка DetailsView:
<asp:DetailsView ID="DetailsView" runat="server" AutoGenerateRows="false">
<Fields>
<asp:BoundField DataField="ValueOne" HeaderText="One" />
<asp:BoundField DataField="ValueTwo" HeaderText="Two" />
<asp:BoundField DataField="ValueThree" HeaderText="Three" />
<asp:BoundField DataField="ValueFour" HeaderText="Four" />
<asp:BoundField DataField="ValueFive" HeaderText="Five" />
</Fields>
</asp:DetailsView>
Подключите событие и свяжите данные в коде:
this.DetailsView.DataBound += new EventHandler(DetailsView_DataBound);
this.DetailsView.DataSource = new BusinessObject[] { myBusinessObject };
this.DetailsView.DataBind();
Напишите процедуру для получения значения и возврата цветов. Это может быть расширено, чтобы вернуть пару значений, таких как background, forcolor и т.д ...
System.Drawing.Color GetColorValue(decimal value)
{
if (value > 0)
{
return System.Drawing.Color.Green;
}
else if (value < 0)
{
return System.Drawing.Color.Red;
}
return System.Drawing.Color.White;
}
Наконец обработчик события
void DetailsView_DataBound(object sender, EventArgs e)
{
foreach (BoundField field in this.DetailsView.Fields)
{
field.ItemStyle.BackColor = GetColorValue((decimal)
this.DetailsView.DataItem.GetType()
.GetProperty(field.DataField)
.GetValue(this.DetailsView.DataItem, null));
}
}