Как установить цвет в DetailsView на основе значения? - PullRequest
0 голосов
/ 20 июня 2011

Использование ASP.NET 4 с C #.

У меня есть 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));
        }
    }           
}

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Мои мысли были такими же, как у Джея.

Markup:

        <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;
        }
    }
}
1 голос
/ 20 июня 2011

Возможно, это не лучший способ, но вы можете обработать событие 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));
    }
}
...