说明:本例是做了工厂的排机报表

一、根据查询日期初始化GridView列

private void IniGridView(DateTime p_DateS,DateTime p_DateE)
{
//1.移除机台以外的列
for (int i = gridView1.Columns.Count - 1; i >= 0; i--)//从后向前遍历删除,否则会引起混乱。不用foreach也是出于此原因
{
if (gridView1.Columns[i].FieldName != "MachineNo")//MachineNo:机台
{
gridView1.Columns.RemoveAt(i);//移除
}
} //2.根据日期增加列
//2-1.判断间隔长度
TimeSpan TS1 = new TimeSpan(SysConvert.ToDateTime(p_DateS).Ticks);//SysConvert是我所使用框架自定义的,可更换为Convert
TimeSpan TS2 = new TimeSpan(SysConvert.ToDateTime(p_DateE).Ticks);
TimeSpan TS = TS1.Subtract(TS2).Duration();
int days = TS.Days; if (days>100)//限制不要超出100天,防止用户误选过长日期,可根据实际情况调整
{
return;
}
//2-2.循环增加列
for (int i = 0; i <= days; i++)
{
//定义列名为日期
DateTime coldate = p_DateS.AddDays(i); //添加列
DevExpress.XtraGrid.Columns.GridColumn column = new DevExpress.XtraGrid.Columns.GridColumn();
column.FieldName = coldate.ToString("yyyy-MM-dd");//把日期作为字段名,此处需要特别注意,填充数据时,需要根据日期确定归属列
column.Caption = coldate.ToString("M.dd");//显示名称
column.Visible = true;//可见性
column.VisibleIndex = i;//序号 必须设置,否则默认-1,仍然不可见
column.ColumnEdit = this.txtMemo;
gridView1.Columns.Add(column);
}
}

二、处理DataTable

public override void BindGrid()
{
string sql = "SELECT MachineNo FROM Data_MachineManage WHERE 1=1 "; // Data_MachineManage是存储所有机台的数据表
DataTable dt = SysUtils.Fill(sql);//SysUtils为框架特有方法,非普遍方法,视实际情况替换
Proc(dt,txtFormDateS.DateTime,txtFormDateE.DateTime);
gridView1.GridControl.DataSource = dt;
gridView1.GridControl.Show();
} /// <summary>
/// 处理数据表,填充排机信息
/// </summary>
/// <param name="dt"></param>
private void Proc(DataTable p_dt,DateTime p_DateS,DateTime p_DateE)
{
//扩充dt表的列数与GridView列数一致
TimeSpan TS1 = new TimeSpan(SysConvert.ToDateTime(p_DateS).Ticks);
TimeSpan TS2 = new TimeSpan(SysConvert.ToDateTime(p_DateE).Ticks);
TimeSpan TS = TS1.Subtract(TS2).Duration();
int days = TS.Days;
if (days>)
{
return;
}
for (int i = ; i <= days; i++)
{
DateTime coldate = p_DateS.AddDays(i);//取当天日期作为列名,与GridView保持一致
p_dt.Columns.Add(coldate.ToString("yyyy-MM-dd"), typeof(string));//添加列
} //根据数据来填格子
string sql = "SELECT * FROM UV1_Sale_SOReviewPlan WHERE ProDate between ' "+p_DateS.toString()+" ' and ' "+p_DateE.toString()+" ' "; //说明:查询出的一条记录包含以下信息:日期ProDate,订单OrderFormNo,机台MachineNo。一条记录只包含一天的排机信息,10.1-10.5号是6条记录,而非一条 DataTable dt = SysUtils.Fill(sql);//把符合条件的所有排机记录取出来
foreach (DataRow dr in dt.Rows)
{
//定义显示字符串
string str=dr["OrderFormNo"].ToString(); //定义机台,方便查询
string JT = dr["MachineNo"].ToString(); //当前行的日期,以便确定属于p_dt表的哪一列
string prodate = SysConvert.ToDateTime(dr["Prodate"]).ToString("yyyy-MM-dd");
DataRow[] p_drarr = p_dt.Select("MachineNo=" + SysString.ToDBString(JT));//在排机表里把机台行取出来
if (p_drarr.Length==)//无此机台则中断本次循环
{
continue;
}
else
{
DataRow p_dr = p_drarr[];//取出符合条件的第一行
p_dr[prodate] = str;//此处prodate为列名,GridView和p_dt中每个日期的字段均为某年某月某日
}
}
}

附上效果图:

使用GridVIew显示Gantt(甘特图),动态增减列的更多相关文章

  1. GridView 显示行号 设置行号列的宽度

    /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="gv" ...

  2. gantt甘特图的制作过程

    甘特图主要是用来做项目管理的,可以清楚的看到任务间的逻辑关系,任务与时间关系和任务间并行关系. 在甘特图中,横轴方向表示时间,纵轴方向并列着活动列表.图表内可以用线条.数字.文字代号等来表示计划(实际 ...

  3. gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)

    前言   Excel功能强大,应用广泛.随着web应用的兴起和完善,用户的要求也越来越高.很多Excel的功能都搬到了sass里面.恨不得给他们做个Excel出来...程序员太难了... 去年我遇到了 ...

  4. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

  5. 【转载】 JQuery.Gantt(甘特图) 开发指南

    转载来自: http://www.cnblogs.com/liusuqi/archive/2013/06/09/3129293.html JQuery.Gantt是一个开源的基于JQuery库的用于实 ...

  6. JQuery.Gantt(甘特图)开发

    一.简介 JQuery.Gantt是一个开源的基于JQuery库的用于实现甘特图效果的可扩展功能的JS组件库. 二.前端页面 2.1 资源引用 首先需要将下载到的源码中的CSS.IMG.JS等资源放入 ...

  7. odoo10甘特图gantt view

    odoo10中的gantt图示例 1.Gantt属性说明 甘特图视图的根元素是<gantt />,它没有子节点但可以采用以下属性: date_start (required) 提供每条记录 ...

  8. java实现甘特图的2种方法:SwiftGantt和Jfree (转)

    http://blog.sina.com.cn/s/blog_50a7c4a601009817.html 第一种方法使用SwiftGantt实现甘特图(进度图推荐这个)   import java.a ...

  9. jquery 甘特图开发指南

    JQuery.Gantt是一个开源的基于JQuery库的用于实现甘特图效果的可扩展功能的JS组件库. <link rel="stylesheet" href="cs ...

随机推荐

  1. FtpClient.storeFile返回false解决方法

    在确定路径和文件名没有中文的情况下添加以下代码 ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE); ftp.enterLocalPassiveMode();/ ...

  2. C++11语法糖

    1.constexpr变量:声明为constexpr的变量一定是一个常量,新标准允许定义一种特殊的constexpr函数使得编译时就可计算结果,这样就能用constexpr函数去初始化constexp ...

  3. understanding ECMAscript 6 ---- block bindings

    Traditionally, the way variable declarations work has been one tricky part of programming in javascr ...

  4. gulp与webpack-stream集成配置

    webpack非常强大,但是也有不足的地方,批量式处理依然是gulp更胜一筹.我们是否可以将两者的优点结合起来呢? 这篇文章就是讲述如何集成gulp和webpack 1.安装webpack-strea ...

  5. svn使用

    1 svn地址: svn://www.svn999.com/annie123.test12345 2 svn 账户: 账户使用时期:项目checkout时期 会提示键入用户名密码 3 新增文件 (1) ...

  6. centos 开机启动服务

    一.启动脚本 /etc/rc.local 启动 最简单的一种方式,在启动脚本 /etc/rc.local (其实 /etc/rc.local 是/etc/rc.d/rc.local 的软链接文件,实际 ...

  7. 用到的一些python包,记录下

    Requests beautifulsoup lxml logging gevent django Bottle numpy pandas sklearn pyopencv opencv_python ...

  8. JavaScript实现输入验证(简单的用户注册)

    1.先写用户注册页面userrAdd.jsp <body> <center> <form name="f1" id="f1" ac ...

  9. PackageManager源码分析

    在android 4.4源码上进行的分析. 一.PackageManager如何产生的? 我们平时在代码中使用的context.getPackageManager() 那么这个PackageManag ...

  10. swift_简单值 | 元祖 | 流程控制 | 字符串 | 集合

    //: Playground - noun: a place where people can play import Cocoa var str = "Hello, playground& ...