如何根据值在DetailsView上设置颜色
本文关键字:设置 颜色 DetailsView 何根 | 更新日期: 2023-09-27 17:59:58
使用带有C#的ASP.NET 4。
我有一个DetailsView
,我使用C#中的代码填充它,基本上将DataTable
从SQL Server绑定到DetailsView
。我想更改详细信息视图中值的颜色,使正值为绿色,零为默认值,负值为红色。最好的方法是什么?
更新
@周我试过这个代码:
private 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;
}
protected void dtlOpenTrade_DataBound(object sender, EventArgs e)
{
foreach (BoundField field in dtlOpenTrade.Fields)
{
field.ItemStyle.BackColor = GetColorValue((decimal)dtlOpenTrade.DataItem.GetType().GetProperty(field.DataField).GetValue(dtlOpenTrade.DataItem, null));
}
}
但我得到了这个错误:System.NullReferenceException: Object reference not set to an instance of an object.
有什么想法吗?
更新2
我用这个代码解决了它,有意义吗?
void RenderDetailsViewColour(DetailsView dtl)
{
foreach (DetailsViewRow row in dtl.Rows)
{
if (row.Cells[0].Text != "TradeId")
{
row.Cells[1].BackColor = GetColorValue(Convert.ToDecimal(row.Cells[1].Text));
}
}
}
这可能不是"最佳方式",但您可以在详细信息视图中处理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();
编写一个例程来获取值并返回颜色。这可以扩展为返回几个值,如背景、颜色等。
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));
}
}
我的想法和周一样。
标记:
<asp:TemplateField HeaderText="Amount Paid" >
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("AmountPaid") %>' />
</ItemTemplate>
</asp:TemplateField>
代码:
protected void DetailsView1_DataBound(object sender, EventArgs e)
{
Label objLabel = (Label)DetailsView1.FindControl("Label1");
if (objLabel != null)
{
Decimal decValue = Convert.ToDecimal(objLabel.Text);
if (decValue > 0)
{
objLabel.ForeColor = System.Drawing.Color.Green;
}
else if (decValue < 0)
{
objLabel.ForeColor = System.Drawing.Color.Red;
}
}
}