asp.net网格视图的怪异行为
本文关键字:net 网格 视图 asp | 更新日期: 2023-09-27 18:25:33
在ASP.NET中使用gridview控件时,我遇到了一个奇怪的问题。我在其中使用分页。
网格中的第二列是"订单状态"列,其中包含"D"、"S"等值。"D"answers"S"是表示"已交付"answers"已发货"的数据库值。我们使用这些表示来节省数据库中的空间。
现在,在GridView中显示它时,我希望它显示为"displayed"或"Shipped",而不是作为数据源一部分的"D"answers"S"。当第一次加载页面时,我通过获取当前页面的行并在页面加载事件的帮助下将单元格的"D"answers"S"更改为"Delivered"answers"Shipped"来处理它。
但是,当我使用网格视图的分页控件转到下一个页面时,问题就会出现。
"订单状态"列中的值不会更新为第二页中的"D"answers"S",因此我的函数将无法提取它们,也无法将它们转换为"已交付"answers"已发货"。
我也尝试了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;
}
我通常不会发布我所有的代码,但我迫切希望得到这个问题的解决方案。如果有任何帮助,我将不胜感激。
提前感谢!
尝试在RowDataBound事件中更新此项。这允许您在每行的绑定处进行调整。
以下是一个示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx
假设您使用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" />
....
这样做的优点是,如果您在应用程序中的任何其他地方都需要该列,那么它很容易重复使用。