【问题标题】:Changing hardcoded dates to dynamic将硬编码日期更改为动态
【发布时间】:2015-12-21 19:14:58
【问题描述】:

我正在处理一些旧代码(不是我的),不幸的是,其中有很多硬编码的代码导致了我现在正在尝试解决的问题。这是我现在的问题:

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

            }
        }
    }

这是 .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 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: c# asp.net hardcoded


    【解决方案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>
    

    我个人什至会研究一种自动化模板字段的方法。看起来你有很多重复的代码,你可以从一个类中创建,就像这个线程的另一个答案中提到的那样。但请尝试上述方法,看看是否能解决您的更新问题。

    【讨论】:

    • 我只是想知道我仍然不喜欢这个解决方案,但是这样你就没有任何硬编码的日期或名称。此外,如果您要求 Sun 为 SUN,请使用 .ToUpper()。
    • 感谢您的回复。我没有考虑缓冲区,但喜欢这个想法。今天无法工作,但我明天会,并将对其进行测试。我会回来的!
    • 看起来我必须以某种方式在 .aspx 中执行此操作,因为有很多“UpdateAfterCallBack”,执行时会将日期恢复为 aspx 中硬编码的日期。不知道如何处理。
    • 不知道该更新是否会有所帮助,但我想我会尝试。
    • 嗯,我认为您正在做某事。但是,出于某种原因,如果我在 c# 部分执行类似您的代码的操作,它会在星期日和星期二之间切换,而不是在星期日和星期一之间切换。
    【解决方案2】:

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

    设置后,查看 DateTime 格式,以便您可以通过迭代 DayOfWeek enumeration 并在 your desired format 中输出来输出“SUN”、“MON”等

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

    最后,this is cool.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多