2012-02-22 8 views
2

ASP.NETでgridviewコントロールを使用すると、私は奇妙な問題に直面しています。私はそれでページングを使用しています。asp.net gridview奇妙な振る舞い

グリッドの2番目の列は、「D」、「S」などの値を含む「注文ステータス」列です。「D」および「S」は、「納入済み」および「出荷済み」を表すデータベース値です。 "これらの表現を使用して、データベース内の領域を節約しています。

これをGridViewに表示している間、データソースの一部として提供される「D」および「S」の代わりに、「表示済み」または「出荷済み」として表示したいと思います。最初にページを読み込むとき、私は現在のページの行を取得し、ページロードイベントの助けを借りて "Delivered"と "Shipped"のセルの "D"と "S"を変更することによってそれを処理しています。

ただし、グリッドビューのページングコントロールを使用して次のページに移動すると問題が発生します。

"Order Status"列の値が2番目のページの "D"と "S"に更新されないため、私の関数がそれらを取り上げることができず、 "Delivered" 「出荷されました」。

私もOnPageIndexChangedイベントを試しました。その:(

でさえ動作していないここでは、コードです。

のGridViewコントロール

<asp:GridView ID="OrderGrid" runat="server" AllowPaging="True" AllowSorting="True" 
       AutoGenerateColumns="False" DataSourceID="OrderHistory" AlternatingRowStyle-CssClass="alt" 
       CssClass="order_grid" DataKeyNames="order_id" OnPageIndexChanging="OrderGrid_PageIndexChanging"> 

のSET ORDER STATUS方法

public void SetOrderStatus() 
{ 
    string Delivered = "Delivered"; 
    string Shipped = "Shipped"; 
    string Processing = "Processing"; 

    for (int i = 0; i < OrderGrid.Rows.Count; i++) 
    { 
     if (OrderGrid.Rows[i].Cells[1].Text == "D") 
     { 
      OrderGrid.Rows[i].Cells[1].Text = Delivered; 
      OrderGrid.Rows[i].Cells[1].BackColor = System.Drawing.Color.FromName("#127b41"); 
      OrderGrid.Rows[i].Cells[1].ForeColor = System.Drawing.Color.FromName("#fdfdfd"); 
     } 

     if (OrderGrid.Rows[i].Cells[1].Text == "S") 
     { 
      OrderGrid.Rows[i].Cells[1].Text = Shipped; 
     } 

     if (OrderGrid.Rows[i].Cells[1].Text == "P") 
     { 
      OrderGrid.Rows[i].Cells[1].Text = Processing; 
     } 
    } 
} 

ページインデックス変更機能

protected void OrderGrid_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    OrderGrid.PageIndex = e.NewPageIndex; 
    OrderGrid.DataBind(); 

    SetOrderStatus(); 
    string o = OrderGrid.Rows[0].Cells[1].Text; 
} 

通常、私のコードはすべて掲載しませんが、私はこの問題を解決するために絶望的です。私は大いに助けていただければ幸いです。

ありがとうございます!

+0

期待される表示値を返すようにデータソースを変更しないのはなぜですか?あなたのプレゼンテーション層は、ステータスコードを表示テキストに翻訳する責任を負うべきではありません。 –

答えて

1

RowDataBoundイベントでこれを更新してください。これにより、各行のバインド時に調整を行うことができます。

は、ここに例です:あなたが質問で列を表現するためにBoundFieldを使用していると仮定すると、 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

+0

魅力的な作品です!ありがとうトンバディ:) – Vikas

+0

こんにちはVikas、それはあなたのために働いた場合、答えとしてマークできますか?ありがとう! – swannee

+0

私はそれが働いた分それをしたいと思った。しかし、私は10分待つことを望んでいます。それが私に許されるとすぐにそれを行います:) – Vikas

1

、あなたはBoundFieldをサブクラス化し、FormatDataメソッドをオーバーライドすることができます。

// untested code - should be approximately correct 
public Class StatusBoundField:BoundField 
{ 
    protected override string FormatDataValue(Object dataValue,bool encode) 
    { 
      string value = dataValue as string; 
      string result = string.Empty; 
      if(!string.IsNullOrEmpty(value) 
      { 
       switch(value) 
       { 
        case "P": result = "Processed"; break; 
        case "S": result = "Shipped"; break; 
        case "D": result = "Delivered"; break; 
        default: result = "Unknown" // or string.Empty or throw an exception as appropriate 
     } 

     return base.FormatDataValue(result, encode); 
    } 
} 

次に、タイプをgridview宣言のバインドされたフィールドに置き換えます。

// replace namespace and assembly as appropriate 
<%@ Register TagPrefix ="my" Namespace="WebApplication1" Assembly="WebApplication1" %> 
.... 
<asp:GridView ID="OrderGrid" runat="server" AllowPaging="True" AllowSorting="True" 
      AutoGenerateColumns="False" DataSourceID="OrderHistory" AlternatingRowStyle-CssClass="alt" 
      CssClass="order_grid" DataKeyNames="order_id"> 
    <Columns> 

     <my:StatusField DataField="OrderStatus" HeaderText="Order Status" 
      SortExpression="OrderStatus" /> 
.... 

これは、アプリケーション内の他の場所にカラムが必要な場合は、簡単に再利用できるという利点があります。

+0

ありがとうございます。それが動作するかどうか試してみるでしょう。 – Vikas

+0

私はそれを調べなければならなかったので、aspxマークアップでサブクラス化されたコントロールを使用する方法を示すコードをいくつか追加しました。 – sga101