Почему Gridview теряет BackColor при нажатии кнопки

У меня есть gridview, для некоторых строк которого задано значение BackColor на основе значения одного из столбцов.

ASPX

<asp:GridView ID="uxTktGridView" runat="server" ShowHeaderWhenEmpty="true" CssClass="GridView" BorderStyle="Solid" onRowDataBound="uxTktGridView_RowDataBound" AutoGenerateColumns="False" OnSorting="uxTktGridView_Sorting" BackColor="White" BorderColor="#D6D2D2" BorderWidth="1px" CellPadding="3" SelectedIndex="-1" DataKeyNames="Ticket Number" AllowSorting="True"  Font-Size="Small" Width="100%" Visible="True" EnableModelValidation="True" style=" margin-top: 10px; margin-bottom: 10px;" OnSelectedIndexChanged="uxTktGridView_SelectedIndexChanged1" EnableViewState="true">
  <Columns>
    <asp:CommandField ShowSelectButton="True" SelectText="Details" ButtonType="Button" HeaderText="Select" />
    <asp:BoundField DataField="Ticket Number" HeaderText="Ticket Number" SortExpression="Ticket Number" />
    <asp:BoundField DataField="Date Of Request" HeaderText="Date Of Request" SortExpression="Date Of Request" />
    <asp:BoundField DataField="Requestor Name" HeaderText="Requestor Name" SortExpression="Requestor Name" />
    <asp:BoundField DataField="Requestor State" HeaderText="Requestor State" SortExpression="Requestor State" />
    <asp:BoundField DataField="Complexity" HeaderText="Complexity" SortExpression="Complexity" />
    <asp:BoundField DataField="Nature of Inquiry" HeaderText="Nature of Inquiry" SortExpression="Nature of Inquiry" />
    <asp:BoundField DataField="Staff" HeaderText="Staff" SortExpression="Staff" />
    <asp:BoundField DataField="Ticket Status" HeaderText="Ticket Status" SortExpression="Ticket Status" />
    <asp:BoundField DataField="Ticket Closure Date" HeaderText="Ticket Closure Date" SortExpression="Ticket Closure Date" />
  </Columns> 
  <FooterStyle BackColor="White" ForeColor="#000066" />
  <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
  <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
  <RowStyle ForeColor="#000066" />
  <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
  <SortedAscendingCellStyle BackColor="#F1F1F1" />
  <SortedAscendingHeaderStyle BackColor="#007DBB" />
  <SortedDescendingCellStyle BackColor="#CAC9C9" />
  <SortedDescendingHeaderStyle BackColor="#00547E" />
</asp:GridView>

Чтобы установить BackColor, я использую функцию _RowDataBound на бэкэнде:

С#

protected void uxTktGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        DataRowView drv = (DataRowView)e.Row.DataItem;
        DateTime currentDate = DateTime.UtcNow.Date;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if (drv != null)
            {
                for (int i = 1; i < uxTktGridView.Columns.Count; i++) //index starts with 1 because the first column in the "select" button.
                {
                    if (e.Row.Cells[8].Text.Equals("OPEN"))
                    {
                        string tier = e.Row.Cells[5].Text.ToString();
                        string date = e.Row.Cells[2].Text.ToString();
                        DateTime recordDate = Convert.ToDateTime(date, CultureInfo.InvariantCulture);
                        int measureDate = (currentDate.Date - recordDate.Date).Days;
                        if (tier == "1")
                        {
                            if (measureDate >= 20)
                            {
                                e.Row.BackColor = Color.FromName("#E56E94");
                            }
                        }
                        else if (tier == "2")
                        {
                            if (measureDate >= 30)
                            {
                                e.Row.BackColor = Color.FromName("#E56E94");
                            }
                        }
                        else if (tier == "3")
                        {
                            if (measureDate >= 35)
                            {
                                e.Row.BackColor = Color.FromName("#E56E94");
                            }
                        }
                        else if (tier == "4")
                        {
                            if (measureDate >= 40)
                            {
                                e.Row.BackColor = Color.FromName("#E56E94");
                            }
                        }  
                    }
                     ...
                }
            }
        }
    }

У меня 2 проблемы с одной и той же проблемой. Если я 1) нажму кнопку или 2) нажму одну из строк - сетка станет белой и не применит настройки BackColor. Я предполагаю, что это какая-то проблема, связанная с PostBack. Я попытался добавить AutoPostBack="false" к кнопкам, а также к сетке. Поведение все еще происходит. Я также попытался добавить исчезновение «EnableViewState = «false»(based on a suggestion) to thegridview. When I click a button, this basically makes mygridview». Любые рекомендации о том, как решить эту проблему?


person gwydion93    schedule 03.05.2019    source источник


Ответы (1)


Понимание порядка событий в WebForms может быть очень полезным в подобных вещах. Например, Page и Control можно поменять местами с именами событий. Порядок событий следующий:

  1. Page_Init(...) (данные ViewState недоступны)
  2. Page_Load(...) (ViewState доступен)
  3. События управления (например, Click, RowSelect и т. д.)
  4. Пререндеринг (...)

Если вы не выполняете привязку данных к сетке после обратной передачи (лучше всего вызывать DataBind() в PreRender после завершения всей логики вашей страницы) и не имеете EnableViewState установленного в true, вы потеряете эту информацию, размещенную в сетке, и не сможет получить к нему доступ в постбэке. ViewState назначается между Init и Load и позволяет получить доступ к свойствам элементов управления. Если вы вызываете DataBind() в Page_Load, ваши управляющие события могут привести к непредсказуемым результатам, поскольку базовые данные могут отличаться.

Другими словами, если вы хотите использовать GridView так, как вы его определили, EnableViewState, по крайней мере, для GridView, должно иметь значение true. Затем вы не должны снова связывать его с DataBind во время обратной передачи.

void Page_PreRender(object sender, EventArgs e)
{
    if (!Page.IsPostback)
    {
        DataBind();
    }
}

и государство должно быть эффективно сохранено. Кроме того, не меняйте значение свойства AutoPostBack.

person Alan Samet    schedule 03.05.2019