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