You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:14:31