Изменение жестко закодированных дат на динамические

Я работаю над некоторым старым кодом (не моим), который, к сожалению, содержит много жестко закодированного кода, который вызывает проблемы, которые я сейчас пытаюсь исправить. Вот моя проблема прямо сейчас:

Существует сетка с 14 столбцами, представляющими две недели. Первый день - это либо понедельник, либо воскресенье, в зависимости от логического значения в коде, которое проверяет, какой "тип" принадлежит пользователю.

Теперь все дни выложены так (это на воскресенье):

    <asp:TemplateField HeaderText="SUN">
        <footertemplate>
            <asp:Label ID="lblD1F" runat="server" ForeColor="white" Width="35px" Text="<%# GetTotal(0).ToString() %>" />
        </footertemplate>
        <headertemplate>
            <asp:Label ID="lblD1H" runat="server" CssClass="hdr_Day" Text="SUN"></asp:Label><br />
            <asp:Label ID="lblD1D" runat="server" CssClass="hdr_Date" Text='<%# _displayDate.ToString("MM/dd") %>'></asp:Label>                
        </headertemplate>
        <itemtemplate>
            <anthem:TextBox id="tbDay1" 
                            runat="server" 
                            Text='<%# Bind("Day1") %>'  
                            CssClass="tbWeekEnd" 
                            AutoCallBack="true" />
            <asp:Label ID="lblDay1" runat="server" Visible="false" Text='<%# Bind("Day1") %>'></asp:Label>

        </itemtemplate>
        <itemstyle cssclass="cell_weekend" />
    </asp:TemplateField>

Таким образом, 14 дней, как указано выше, приводятся ниже:

пример

Теперь я пытался сделать так, чтобы это началось в воскресенье ИЛИ в понедельник, в зависимости от пользователя. Я в значительной степени жестко запрограммировал новые строки поверх старых, что только начинает вызывать больше проблем. Сначала я сделал две постоянные строки:

String[] userADays = new String[] { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
String[] userBDays = new String[] { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };

protected void gvMasterProjects_RowDataBound(object sender, GridViewRowEventArgs e)
{

    //This if/else statement overrides the hard coded date headers in the timeEntry aspx files since the days were hardcoded in.
    //Populates the cells w/ the data from one of two arrays depending if the user is A or B.
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.CssClass = "HeaderStyle";
        if (isUserB == false)
        {
            for (int i = 9; i < 23; i++)
            {
                e.Row.Cells[i].Font.Size = 10;
                e.Row.Cells[i].Text = userADays[i - 9] + "\n" + " " + _displayDate.AddDays(i-9).ToString("MM/dd") + " ";

            }
        }

        else
        {
            for (int i = 9; i < 23; i++)
            {
                e.Row.Cells[i].Font.Size = 10;
                e.Row.Cells[i].Text = UserBDays[i - 9] + "\n" + " " + _displayDate.AddDays(i - 9).ToString("MM/dd") + " ";

            }
        }
    }

Вот материал gridview в файле.aspx:

<anthem:GridView 
    ID="gvMasterProjects" 

    runat="server" 
    AutoGenerateColumns="false" 
    ShowFooter="true" 
    OnRowDataBound="gvMasterProjects_RowDataBound" 
    AllowPaging="false"
    EnableViewState="true" 
    HorizontalAlign="Center"
    AlternatingRowStyle-CssClass="AlternatingRowStyle" 
    RowStyle-CssClass="RowStyle" 
    HeaderStyle-CssClass="HeaderStyle" style="margin-left: 71px">

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

Изменить: Попытка ответов ниже, которые работают, за исключением того, что есть много строк "UpdateAfterCallBack", которые выполняются, в результате чего даты возвращаются к жестко закодированным в.aspx. Есть ли простой способ сделать это в.aspx?

2 ответа

Решение

Рассматривали ли вы просто наличие "буферного" Дня там, чтобы, если пользователь относится к тому типу, который вы хотите, добавить один день в начальный день?

Что бы это сделать, это создать буфер, который по умолчанию равен 0 и 1, если пользователь определенного типа. Затем это добавляется, и у вас есть своя дата.

protected void gvMasterProjects_RowDataBound(object sender, GridViewRowEventArgs  e)
{
    //This if/else statement overrides the hard coded date headers in the timeEntry aspx files since the days were hardcoded in.
    //Populates the cells w/ the data from one of two arrays depending if the user is A or B.
    if (e.Row.RowType == DataControlRowType.Header)
    {
        e.Row.CssClass = "HeaderStyle";
        var bufferDay = 0; // Starts on sunday.
        if (isUserB)
        {
            bufferDay = 1; // Starts on Monday.
        }
        for (int i = 9; i < 23; i++)
        {
            e.Row.Cells[i].Font.Size = 10;
            var dayOfWeek = _displayDate.AddDays(i - 9 + bufferDay);
            e.Row.Cells[i].Text = dayOfWeek.ToString("ddd") + "\n" + " " + dayOfWeek.ToString("MM/dd") + " ";
        }        
    }
}

В соответствии с вашими правками: что произойдет, если вы отредактируете.aspx следующим образом, чтобы он вытягивал текст дня на основе предоставленной даты? Я не уверен, нужно ли вам добавлять ссылку на _displayDate для HeaderText или нет (прошло уже много времени с тех пор, как я запутался в aspx). Я не уверен, что данные будут даже связаны в то время, когда вы вызываете их в sub в HeaderText.

  <asp:TemplateField HeaderText="SUN">
    <footertemplate>
        <asp:Label ID="lblD1F" runat="server" ForeColor="white" Width="35px" Text="<%# GetTotal(0).ToString() %>" />
    </footertemplate>
    <headertemplate>
        <asp:Label ID="lblD1H" runat="server" CssClass="hdr_Day" Text='<%# _displayDate.ToString("mmm") %>'></asp:Label><br />
        <asp:Label ID="lblD1D" runat="server" CssClass="hdr_Date" Text='<%# _displayDate.ToString("MM/dd") %>'></asp:Label>                
    </headertemplate>
    <itemtemplate>
        <anthem:TextBox id="tbDay1" 
                        runat="server" 
                        Text='<%# Bind("Day1") %>'  
                        CssClass="tbWeekEnd" 
                        AutoCallBack="true" />
        <asp:Label ID="lblDay1" runat="server" Visible="false" Text='<%# Bind("Day1") %>'></asp:Label>

    </itemtemplate>
    <itemstyle cssclass="cell_weekend" />
</asp:TemplateField>

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

Вот SO поток, который объясняет установку начального дня недели. Это предполагает создание "нестандартной культуры". Обратите внимание, что DateTimeFormatInfo класс имеет FirstDayOfWeek имущество. Я полагаю, вы можете создать 2 экземпляра, каждый из которых начинается с другого дня. Возможно, особой культуры немного много, в любом случае есть FirstWeekDay свойство где-то, что ваш код устанавливает.

После установки посмотрите на форматирование DateTime, чтобы вы могли выводить "SUN", "MON" и т. Д., Просматривая перечисление DayOfWeek и выводя его в нужном формате.

Все вышеперечисленное должно быть инкапсулировано в класс, поэтому нужно просто вызывать простые методы или свойства. Это действительно очистит кодирование на "уровне", который вы показываете; и это многоразово конечно. Но опять же, я представляю себе экземпляр для каждого первого дня недели, но я подозреваю, что большая часть кода может быть static,

Наконец, это круто.

Другие вопросы по тегам