Почему Gridview теряет BackColor при нажатии кнопки - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 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 в бэкэнде:

C #

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 проблемы с той же проблемой.Если I 1) Нажмите на кнопку или 2) Нажмите на одну из строк - сетка исчезнет и не применяет настройки BackColor.Я предполагаю, что это какая-то проблема, связанная с PostBack.Я попытался добавить AutoPostBack="false" к кнопкам, а также к сетке.Поведение все еще происходит.Я также попытался добавить 'EnableViewState = "false" (based on a suggestion) to the gridview . When I click a button, this basically makes my gridview` исчезнуть.Любые рекомендации о том, как решить эту проблему?

1 Ответ

1 голос
/ 04 мая 2019

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

  1. Page_Init (...) (данные ViewState недоступны)
  2. Page_Load (...) (ViewState доступен)
  3. Управляющие события (например, Click, RowSelect и т. Д.)
  4. PreRender (...)

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

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

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

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

...