asp.net 中gridview还是挺好用的,尤其格式的设置对我们这种不会css的人来说很合适。但是有时候需要动态的创建column,而且datasource也需要编辑。下面举例代码
1. 动态添加column,column为多个日期
/// <summary>
/// 界面增加列
/// </summary>
/// <param name="start"></param>
/// <param name="bWeeklyOrDaily">true为按周,false为按天</param>
/// <param name="end"></param>
protected void BindData(DateTime start, DateTime end, bool bWeeklyOrDaily)
{
if (bWeeklyOrDaily)
{
start = start.AddDays((int)start.DayOfWeek * (-1) + 1);
end = end.AddDays((int)end.DayOfWeek * (-1) + 1);
}
for (DateTime t = start; t <= end; t = t.AddDays(bWeeklyOrDaily ? 7 : 1))
{
BoundField bfd = new BoundField();
bfd.DataField = bfd.HeaderText = t.ToString("yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo);
this.GridViewProduct.Columns.Add(bfd);
}
this.GridViewProduct.DataSource = GetDataTable(start,end, bWeeklyOrDaily);
this.GridViewProduct.DataBind();
}
2. 动态创建dataset
/// <summary>
/// 获取数据
/// </summary>
/// <param name="start">开始日期</param>
/// <param name="end">结束日期</param>
/// <param name="bWeeklyOrDaily">true为按周,false为按天</param>
/// <returns></returns>
DataSet GetDataTable(DateTime start, DateTime end, bool bWeeklyOrDaily)
{
DataSet ds = new DataSet();
DataTable dt = new DataTable("productData");
DataColumn dc1 = new DataColumn("产品线", Type.GetType("System.String"));
dt.Columns.Add(dc1);
for (DateTime t = start; t <= end; t = t.AddDays(bWeeklyOrDaily ? 7 : 1))
{
DataColumn dc = new DataColumn(t.ToString("yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo), Type.GetType("System.String"));
dt.Columns.Add(dc);
}
//以上代码完成了DataTable的构架,但是里面是没有任何数据的
List<string> pNamesWithData = DB.GetPrductLineWithData(); //GetPrductLineWithData函数访问数据库获取产品线
foreach (string pname in pNamesWithData)
{
DataRow dr = dt.NewRow();
dr["产品线"] = pname;
Dictionary<string, string> pData = DB.GetProductLineDataSize(pname,start);//GetProductLineDataSize函数
for (DateTime t = start; t <= end; t = t.AddDays(bWeeklyOrDaily?7:1))
{
string strDate = t.ToString("yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo);
if (pData.ContainsKey(strDate))
{
long size;
if (long.TryParse(pData[strDate], out size))
{
if (size < 1024)
dr[strDate] = size + "B";
else if (size < 1024 * 1024)
dr[strDate] = string.Format("{0:.00}KB", size / 1024.0);
else if (size < 1024 * 1024 * 1024)
dr[strDate] = string.Format("{0:.00}MB", size / (1024.0 * 1024));
else
dr[strDate] = string.Format("{0:.000}GB", size / (1024.0 * 1024 * 1024));
}
else
{
dr[strDate] = pData[strDate] + "B";
}
}
else
dr[strDate] = "没记录";
}
dt.Rows.Add(dr);
}
ds.Tables.Add(dt);
return ds;
}