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

C# 将硬编码日期更改为动态,c#,asp.net,hardcoded,C#,Asp.net,Hardcoded,我正在编写一些旧代码(不是我的),不幸的是,这些代码中有很多硬编码的代码,这些代码导致了我现在试图修复的问题。我现在的问题是: 有一个gridview,14列代表两周。第一天是星期一或星期天,具体取决于代码中的布尔值,该布尔值用于检查用户是哪种“类型” 现在,所有的日子都是这样安排的(这是星期天): 现在,我正试图让它在周日或周一开始,根据用户。我几乎是在旧字符串的基础上硬编码新字符串,这才刚刚开始引起更多的问题。首先,我创建了两个常量字符串: String[] userADays = new

我正在编写一些旧代码(不是我的),不幸的是,这些代码中有很多硬编码的代码,这些代码导致了我现在试图修复的问题。我现在的问题是:

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

            }
        }
    }
String[]userADays=新字符串[]{“SUN”、“MON”、“TUE”、“WED”、“THU”、“FRI”、“SAT”、“SUN”、“MON”、“TUE”、“WED”、“THU”、“FRI”、“SAT”};
String[]userBDays=新字符串[]{“MON”、“TUE”、“WED”、“THU”、“FRI”、“SAT”、“SUN”、“MON”、“TUE”、“WED”、“THU”、“FRI”、“SAT”、“SUN”};
受保护的void gvMasterProjects_RowDataBound(对象发送方,GridViewRowEventArgs e)
{
//此if/else语句将覆盖timeEntry aspx文件中的硬编码日期头,因为日期是硬编码的。
//根据用户是A还是B,使用来自两个数组之一的数据填充单元格。
if(e.Row.RowType==DataControlRowType.Header)
{
e、 Row.CssClass=“HeaderStyle”;
if(isUserB==false)
{
对于(int i=9;i<23;i++)
{
e、 行.单元格[i].Font.Size=10;
e、 Row.Cells[i].Text=userADays[i-9]+“\n”+”+\u displayDate.AddDays(i-9).ToString(“MM/dd”)+”;
}
}
其他的
{
对于(int i=9;i<23;i++)
{
e、 行.单元格[i].Font.Size=10;
e、 Row.Cells[i].Text=UserBDays[i-9]+“\n”+”+\u 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中有没有一种简单的方法来实现这一点?

您考虑过只使用“缓冲区”吗如果用户是您想要的类型,您可以在开始日添加一天

这将创建一个缓冲区,默认情况下为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") + " ";
        }        
    }
}
受保护的void gvMasterProjects\u RowDataBound(对象发送方,GridViewRowEventArgs e)
{
//此if/else语句将覆盖timeEntry aspx文件中的硬编码日期头,因为日期是硬编码的。
//根据用户是A还是B,使用来自两个数组之一的数据填充单元格。
if(e.Row.RowType==DataControlRowType.Header)
{
e、 Row.CssClass=“HeaderStyle”;
var bufferDay=0;//从星期天开始。
if(isUserB)
{
bufferDay=1;//从星期一开始。
}
对于(int i=9;i<23;i++)
{
e、 行.单元格[i].Font.Size=10;
var dayOfWeek=\u 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的方法。看起来你有很多重复的代码,你可以从这个线程的另一个答案中提到的类中创建这些代码。但是试试上面的方法,看看这是否解决了你的更新问题。

这解释了如何设置一周的第一天。它包括s正在创建一个“自定义区域性”。请注意,有一个
FirstDayOfWeek
属性。我想您可以创建两个实例,每个实例从不同的日期开始。自定义区域性可能有点多,在任何情况下,在代码设置的某个地方都有一个
FirstWeekDay
属性

设置后,查看日期时间格式,以便通过迭代并在中输出来输出“SUN”、“MON”等

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


最后,

我只是想知道我仍然不喜欢这个解决方案,但这样你就没有任何硬编码的日期或名称了。另外,如果你要求Sun成为Sun,那么就使用.ToUpper()谢谢你的回复。我没有考虑缓冲区,但像这个想法。今天不能工作,但我明天会测试它。我会回到它的进展。看起来我必须在某种程度上做到这一点。ASPX,因为有很多“更新后回调”。,执行时会将日期还原为aspx中的硬编码日期。不确定如何处理。不知道更新是否会有帮助,但我想我会尝试。嗯,我想你知道了一些事情。不过,出于某种原因,如果我在c部分执行类似于你的代码的操作,它会切换
  <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>