.Net Chart 图形控件 生成统计曲线图

使用自带的Chart控件生成统计曲线图。

该控件需引用System.Web.DataVisualization。
以下示例代码:

//创建曲线图对象
System.Web.UI.DataVisualization.Charting.Chart Chart2 = new System.Web.UI.DataVisualization.Charting.Chart();

//设置宽高
Chart2.Width = 958;
Chart2.Height = 400;

//以图片形式输出。
Chart2.RenderType = System.Web.UI.DataVisualization.Charting.RenderType.ImageTag;

//设置标题对象,将标题对象添加到曲线图中。
Title title = new Title(startTime.ToString(“yyyy-MM-dd”) + “~” + endTime.ToString(“yyyy-MM-dd”) + “时间段的推广注册用户曲线图”);
Chart2.Titles.Add(title);
//绘图区域
Chart2.ChartAreas.Add(“series”);
Series series1 = new Series();
series1.Name = “注册人数曲线”;
//数据显示方式 Line:为折线 Spline:曲线
series1.ChartType = System.Web.UI.DataVisualization.Charting.SeriesChartType.Spline;
//线条颜色
series1.Color = Color.Green;
//线条宽度
series1.BorderWidth = 2;
//阴影宽度
series1.ShadowOffset = 1;
if (list.Count() <= 200)
{
series1.IsVisibleInLegend = true; //是否显示线条数据说明
series1.IsValueShownAsLabel = true; //线条上是否指定的数据
series1.MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型
series1.MarkerSize = 8; // 标志的大小
series1.LabelForeColor = Color.Red;
}

//内存流
MemoryStream imageStream = new MemoryStream();
double totalNum = 0;
foreach (TongjiUser model in list)
{
//分别往X,Y轴添加数据(可以为多种类型) (有多中添加方式)
series1.Points.AddXY(model.Time.ToString(“yyyy-MM-dd”), model.Count);
totalNum += model.Count;
}
string strSarr = ” 总数:” + totalNum + ” 平均值:” + Math.Round(totalNum /((endTime-startTime).Days+1), 2) + “注册率:” + Math.Round(totalNum / newList.Count(), 4) * 100 + “%”;
series1.BorderColor = System.Drawing.Color.Gray;
series1.ChartArea = “series”;

Chart2.Series.Add(series1);

Chart2.ChartAreas[0].AxisY.Title = “注册人数曲线”;
Chart2.ChartAreas[0].AxisX.Title = strSarr;

////中间X,Y线条的颜色设置
//Chart2.ChartAreas[0].AxisX.LineDashStyle = ChartDashStyle.DashDotDot;
//Chart2.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Blue;

Chart2.Legends.Add(“Legend1”);
Chart2.SaveImage(imageStream, ChartImageFormat.Png);
imageStream.Position = 0;
return new FileStreamResult(imageStream, “image/png”);

}

注:X、Y轴所有的标注都显示需添加如下代码,默认为跳着显示。

Chart1.ChartAreas[0].AxisX.IntervalAutoMode =  IntervalAutoMode.VariableCount;
Chart1.ChartAreas[0].AxisX.LabelStyle.IsStaggered = true;

DataSet中DataTable添加行引发“该行已经属于另一个表”错误

示例:将dt1的数据复制到dt2中。

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();

//将dt1的结构克隆给dt2
dt2 = dt1.Clone();
for (int i = 0; i < dt1.Rows.Count; i++)
{
DataRow dr = dt2.NewRow();
dr = dt1.Rows[i];
//此行将引发——DataTable添加行出现“该行已经属于另一个表”的错误
//dt2.Rows.Add(dr);
//换成这种写法是正确的或者可以直接使用dt2.Rows.Add(dt1.Rows[i].ItemArray);
dt2.Rows.Add(dr.ItemArray);
}

JS 获取某个元素上一个或下一个节点 previousSibling & nextSibling

nextSibling 属性可返回节某个元素之后下一个节点。
previousSibling则与其相反,获取的是同一层级的上一节点。
语法:
nodeObject.nextSibling
例如,txt控件在一个table中,若想要输出该txt所在单元格的上一个单元格内的值。
alert(txt.parentNode.previousSibling.innerText);