【问题标题】:How to set color on a DetailsView based on a value?如何根据值在 DetailsView 上设置颜色?
【发布时间】:2011-06-20 13:51:22
【问题描述】:

将 ASP.NET 4 与 C# 结合使用。

我有一个 DetailsView,我使用 C# 中的代码隐藏来填充它,基本上将一个 DataTable 从 SQL Server 绑定到 DetailsView。我想更改详细信息视图中值的颜色,使正值是绿色,零是默认值,负值是红色。最好的方法是什么?

更新

@Jay 我试过这段代码:

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));
        }
    }           
}

【问题讨论】:

    标签: c# asp.net detailsview


    【解决方案1】:

    这可能不是“最好的方法”,但您可以在详细信息视图中处理 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));
        }
    }
    

    【讨论】:

    • 异常从何而来?我假设并简单地说您的数据是小数。您绑定的对象可能不同。
    • 我用的是小数,错误来自field.ItemStyle.BackColor = GetColorValue((decimal)dtlOpenTrade.DataItem.GetType().GetProperty(field.DataField).GetValue(dtlOpenTrade.DataItem, null));
    • 那行有很多事情要做。需要弄清楚哪个部分是空的。这也假设您的DetailsView 中的所有字段都是BoundFields
    • @Jay:检查我的更新 2。有意义吗?
    • 这也行。您只需确保每次 DetailsView 数据绑定时都会调用您的方法。
    【解决方案2】:

    我的想法和杰的想法一样。

    标记:

            <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;
            }
        }
    }
    

    【讨论】:

    • 这种方式也可以,您只需确保在您的方法中考虑了您想要设置样式的每个字段。但是,如果您要制作模板,为什么不直接从标记中评估样式呢?
    猜你喜欢
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2018-07-14
    • 2021-11-29
    • 2014-03-11
    • 1970-01-01
    • 2015-07-17
    • 2011-05-07
    相关资源
    最近更新 更多