2012-02-22 64 views
2

在ASP.NET中使用gridview控件时,我遇到了一个奇怪的问题。我正在使用分页。asp.net gridview怪异行为

网格中的第二列是包含诸如“D”,“S”等的值的“订单状态”列。“D”和“S”是代表“已交付”和“已发货”。我们正在使用这些表示来节省数据库中的空间。

现在,在GridView中显示它时,我希望它显示为“Displayed”或“Shipped”,而不是显示为数据源一部分的“D”和“S”。第一次加载页面时,我通过获取当前页面的行并通过页面加载事件的帮助,使用“已发送”和“已发送”更改单元格的“D”和“S”来处理它。

但是,当我使用网格视图的分页控件转到下一页时,会出现问题。

“订单状态”列中的值未更新为第二页中的“D”和“S”,因此我的功能将无法将其提取并将其转换为“已交货”和“运送”。

我也尝试了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状态的方法

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

为什么不更改数据源以返回预期的显示值?您的表示层不应该负责将状态代码翻译成显示文本。 – 2012-02-22 20:14:41

回答

1

尝试在RowDataBound事件中更新它。这使您可以对每行的绑定进行调整。

这里有一个例子:假设你正在使用的BoundField表示有问题的列 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

+0

工程就像一个魅力!感谢吨哥们:) – Vikas 2012-02-22 20:12:50

+0

嗨Vikas,你能标记为答案,如果它为你工作?谢谢! – swannee 2012-02-22 20:14:57

+0

当然。我希望一分钟就能做到。但是SO要我等10分钟。一旦它允许我会尽快做到:) – Vikas 2012-02-22 20:17:40

1

,你可以继承绑定列,并重写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 2012-02-22 20:26:29

+0

因为我不得不查看它,所以我添加了一些代码来展示如何在aspx标记中使用子类控件。 – sga101 2012-02-22 20:52:02