将硬编码日期更改为动态日期

时间:2015-12-21 19:14:59

标签: c# asp.net hardcoded

我正在处理一些旧的代码(不是我的代码),遗憾的是,代码中包含大量硬编码代码,导致我正在尝试解决的问题。这是我现在的问题:

有一个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天的设置结果如下:

example

现在,我试图让它成为星期日或星期一开始,基于用户。我几乎把新字符串硬编码在旧字符串之上,这刚刚开始引起更多问题。首先,我做了两个不变的字符串:

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") + " ";

            }
        }
    }

这是.aspx文件中的gridview内容:

<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)

您是否考虑过只有一个“缓冲”日,以便如果用户属于您想要的类型,那么您可以在开始日添加一天?

这样做会创建一个默认为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,以便根据提供的日期提取日期文本,会发生什么?我不确定你是否必须为HeaderText添加对_displayDate的引用(因为我与aspx混淆了一段时间)。我不确定在HeaderText中将数据调用为sub时数据是否会被绑定。

  <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的方法。看起来你有很多重复的代码,你可以从一个类创建,就像在这个线程的另一个答案中提到的那样。但请尝试以上操作,看看是否能解决您的更新问题。

答案 1 :(得分:1)

Here is a SO thread解释了设置一周的初始日期。它涉及创建“定制文化”。请注意,DateTimeFormatInfo class具有FirstDayOfWeek属性。我想你可以创建2个实例,每个实例从不同的一天开始。也许自定义文化有点多,无论如何都有代码设置的FirstWeekDay属性某处

设置后,查看DateTime格式,以便通过迭代DayOfWeek enumeration并在your desired format

中输出来输出“SUN”,“MON”等。

以上所有内容都应该封装在一个类中,这只是调用简单方法或属性的问题。它会真正清理你所展示的“级别”的编码;它当然是可以重复使用的。但同样,我正在为每周的第一天想象一个实例,但我怀疑大部分代码可能是static

最后,this is cool.