2011-06-20 14 views
0

ASP.NET 4をC#で使用する。値に基づいてDetailsViewの色を設定する方法は?

私はDetailsViewを持っています。これはC#でコードビハインドを使用して実装していますが、基本的にDataTableDetailsViewにバインドしています。詳細ビューの値の色を変更して、正の値が緑、ゼロがデフォルト、負の値が赤になるように変更したいとします。これを行う最善の方法は何ですか?

UPDATE

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

答えて

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

値をとって色を返すルーチンを書く。これは、私の考えは、ジェイのと同じであった

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

おかげでジェイ、私はあなたが簡単に見を持っている可能性があり、私のQを更新しましたか? –

+0

例外はどこから来ますか?私はあなたのデータが小数であると仮定していました。バインドするオブジェクトは異なる場合があります。 – Jay

+0

私は小数点を使用していますが、エラーは 'field.ItemStyle.BackColor = GetColorValue(10進数)dtlOpenTrade.DataItem.GetType()。GetProperty(field.DataField).GetValue(dtlOpenTrade.DataItem、null)); ' –

1

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

最後にイベントハンドラ...などなど、背景、forcolor、などの値のカップルを返すように拡張することができます。

マークアップ:

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

この方法も同様に機能します。スタイリングしたい各フィールドがメソッド内で考慮されていることを確認するだけです。しかし、あなたがテンプレートを作成するために行っても、マークアップから直接スタイルを評価するのはなぜですか? – Jay

関連する問題