如何根据值在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));
        }
    }           
}

如何根据值在DetailsView上设置颜色

这可能不是"最佳方式",但您可以在详细信息视图中处理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;
        }
    }
}