【问题标题】:asp.net gridview weird behaviourasp.net gridview 奇怪的行为
【发布时间】:2012-02-22 20:06:09
【问题描述】:

在 ASP.NET 中使用 gridview 控件时遇到一个奇怪的问题。我正在其中使用分页。

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

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

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

“订单状态”列中的值不会更新为第二页中的“D”和“S”,因此我的函数将无法提取它们并且无法将它们转换为“已交付”并且“已发货”。

我也尝试了OnPageIndexChanged 事件。即使这样也不能工作:(

这是代码。

网格视图控制

<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">

设置订单状态方法

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

我通常不会发布我的所有代码,但我迫切希望找到解决此问题的方法。我将不胜感激任何帮助。

提前致谢!

【问题讨论】:

  • 为什么不改变您的数据源以返回预期的显示值?您的表示层不应负责将状态代码转换为显示文本。

标签: c# asp.net gridview


【解决方案1】:

尝试在 RowDataBound 事件中更新它。这允许您在每行的绑定处进行调整。

这是一个例子: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

【讨论】:

  • 像魅力一样工作!非常感谢朋友:)
  • 嗨 Vikas,如果它对你有用,你能标记为答案吗?谢谢!
  • 当然。我想在它起作用的那一刻就去做。但是 SO 要我等 10 分钟。只要允许我就会这样做:)
【解决方案2】:

假设您使用 BoundField 来表示有问题的列,您可以继承 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" />
....

如果您在应用程序的其他任何地方需要该列,它的优点是可以轻松重复使用。

【讨论】:

  • 由于我必须查找它,所以我添加了一些代码来展示如何在 aspx 标记中使用子类控件。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2013-08-19
  • 2017-03-24
相关资源
最近更新 更多