GridView列字体颜色设置及班次定时重置数据求助
解决方案:设置Actual列文本颜色 + 按班次重置数据
针对你的两个问题,我分两部分来解答:
一、将包含"Actual"的列文本设置为绿色
因为你的CreatePackingStats方法是在独立类中生成DataTable,没办法直接操作GridView的样式,所以最直接的方式是利用GridView的RowDataBound事件来处理样式——这个事件会在每一行数据绑定到GridView时触发。
步骤1:在ASPX页面的GridView标签中绑定事件
<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="True"> </asp:GridView>
(如果你的列是手动定义的,去掉AutoGenerateColumns="True"即可)
步骤2:在页面后台(.aspx.cs)实现事件方法
如果是自动生成列的情况,用下面的代码:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 只处理数据行,跳过表头、页脚等非数据行 if (e.Row.RowType == DataControlRowType.DataRow) { foreach (TableCell cell in e.Row.Cells) { // 获取当前单元格对应的列头文本 DataControlFieldCell fieldCell = cell as DataControlFieldCell; if (fieldCell != null && fieldCell.ContainingField.HeaderText.IndexOf("Actual", StringComparison.OrdinalIgnoreCase) >= 0) { // 设置文本为绿色(用OrdinalIgnoreCase是为了不区分大小写,如果你确定列名是严格的"Actual",直接用Contains即可) cell.ForeColor = System.Drawing.Color.Green; } } } }
如果是手动定义列的情况,可以简化为:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { for (int i = 0; i < GridView1.Columns.Count; i++) { if (GridView1.Columns[i].HeaderText.Contains("Actual")) { e.Row.Cells[i].ForeColor = System.Drawing.Color.Green; } } } }
二、按8小时班次重置数据为0
首先我们需要判断当前时间属于哪个班次,然后在数据填充时强制将新班次的Actual数据重置为0,也可以设置定时自动刷新重置。
1. 编写班次判断方法
先写一个工具方法来获取当前班次的开始时间:
private DateTime GetCurrentShiftStart() { DateTime now = DateTime.Now; int currentHour = now.Hour; if (currentHour >= 6 && currentHour < 14) { // 早班:6:00 - 14:00 return new DateTime(now.Year, now.Month, now.Day, 6, 0, 0); } else if (currentHour >= 14 && currentHour < 22) { // 中班:14:00 - 22:00 return new DateTime(now.Year, now.Month, now.Day, 14, 0, 0); } else { // 晚班:22:00 - 次日6:00 return currentHour >= 22 ? new DateTime(now.Year, now.Month, now.Day, 22, 0, 0) : now.AddDays(-1).Date.AddHours(22); } }
2. 修改CreatePackingStats方法,添加重置逻辑
我们需要给CreatePackingStats方法传入班次开始时间,用来判断是否需要重置数据:
public DataTable CreatePackingStats(DataSet dset, DateTime shiftStart) { using (DataManager dmgr = new DataManager()) { DataTable target = dset.Tables[0]; DataTable actual = dset.Tables[1]; DataColumn[] cols = new DataColumn[1]; cols[0] = actual.Columns["Hour"]; actual.PrimaryKey = cols; DataTable final = new DataTable(); // 创建列的逻辑保持不变 foreach (DataColumn col in target.Columns) { final.Columns.Add(new DataColumn(col.ColumnName, col.DataType)); if (col.ColumnName.Contains("Target")) { string newColumnName = col.ColumnName.Replace("Target", "Actual"); final.Columns.Add(newColumnName, col.DataType); } } // 填充行的逻辑,添加重置判断 foreach (DataRow row in target.Rows) { string key = row["Hour"].ToString(); DataRow newRow = final.Rows.Add(); foreach (DataColumn col in final.Columns) { if (col.ColumnName.Contains("HOUR") || col.ColumnName.Contains("Target")) { newRow[col.ColumnName] = row[col.ColumnName]; } else { // 尝试转换Hour列的值为时间(如果是数字小时,直接转成int即可) if (DateTime.TryParse(key, out DateTime rowHour)) { // 如果当前行是班次开始的小时,强制重置为0 if (rowHour.Hour == shiftStart.Hour) { newRow[col.ColumnName] = 0; continue; } } // 原来的Actual数据填充逻辑 DataColumn actColumn = actual.Columns[col.ColumnName] as DataColumn; if (actColumn == null) { newRow[col.ColumnName] = 0; } else { var actualValue = actual.Rows.Find(key)[col.ColumnName]; newRow[col.ColumnName] = string.IsNullOrEmpty(actualValue.ToString()) ? 0 : actualValue; } } } } return final; } }
3. 更新Refreshdata方法,传入班次开始时间
public void Refreshdata(int selectedProduct, DateTime shiftStart, DateTime shiftEnd) { BizManager biz = new BizManager(); DataSet ds = biz.GetPacktstatisticsForShift(shiftStart, shiftEnd, selectedProduct); // 传入班次开始时间 DataTable statsTable = CreatePackingStats(ds, shiftStart); GridView1.DataSource = statsTable.DefaultView; GridView1.DataBind(); }
4. 定时自动刷新(可选)
如果需要页面每8小时自动刷新并重置数据,可以用ASP.NET的Timer控件配合UpdatePanel实现无刷新更新:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <asp:Timer ID="ShiftTimer" runat="server" Interval="28800000" OnTick="ShiftTimer_Tick"></asp:Timer> <asp:UpdatePanel ID="GridViewUpdatePanel" runat="server"> <ContentTemplate> <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="True"> </asp:GridView> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="ShiftTimer" EventName="Tick" /> </Triggers> </asp:UpdatePanel>
然后在后台实现Tick事件:
protected void ShiftTimer_Tick(object sender, EventArgs e) { DateTime shiftStart = GetCurrentShiftStart(); DateTime shiftEnd = shiftStart.AddHours(8); // 这里替换成你的selectedProduct的实际值,比如从Session或其他地方获取 int selectedProduct = GetSelectedProduct(); Refreshdata(selectedProduct, shiftStart, shiftEnd); } // 示例方法:获取选中的产品ID,根据你的实际实现调整 private int GetSelectedProduct() { // 比如从Session中获取 return Session["SelectedProduct"] != null ? (int)Session["SelectedProduct"] : 0; }
(Interval的值是28800000毫秒,等于8小时)
内容的提问来源于stack exchange,提问作者user7422837
相关产品推荐
相关产品推荐

