asp.net gridview странное поведение - PullRequest
2 голосов
/ 23 февраля 2012

Я сталкиваюсь со странной проблемой при использовании элемента управления gridview в ASP.NET.Я использую пейджинг в нем.

Второй столбец в сетке - это столбец «Статус заказа», который содержит значения, такие как «D», «S» и т. Д. «D» и «S»Значения базы данных, представляющие «Доставлено» и «Доставлено».Мы используем эти представления для экономии места в базе данных.

Теперь, пока он отображается в GridView, я бы хотел, чтобы он отображался как «Отображаемый» или «Отправленный» вместо «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">

УСТАНОВИТЬ МЕТОД СТАТУСА ЗАКАЗА

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

Обычно я не публикую весь свой код, но мне не терпится найти решение этой проблемы.был бы очень признателен за любую помощь, которая приходит.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Предполагая, что вы используете 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" />
....

Это имеет то преимущество, что его легко использовать повторно, если вам нужен столбец где-либо еще в вашем приложении.

1 голос
/ 23 февраля 2012

Попробуйте обновить это в событии RowDataBound.Это позволяет вам выполнить настройку при привязке каждой строки.

Вот пример: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...