叕叕叕到周五了,时间总是走的如此之快,不免伤感(- -)。。。(伤感个毛线呀,再伤感16年就走了)12月就要结束了,赶紧来一篇充实一下生活。最近在项目中,做了个图表程序,使用到了Chart,今天在这里做一个整理总结。

1.第一个Chart控件

1)先来熟悉一下chart,在前端做一个图表可能会用到chart.js,在C#中可以用自带的控件chart,感觉挺方便的。

2)创建一个项目,windows窗体应用程序。在工具箱的【数据】找到【 Chart】控件,并拖到窗体

C#之Chart篇_sql

3)右键chart【属性】,在VS右侧属性【布局】下面找到【Dock】属性设置为Fill,自己再调整一下大小

C#之Chart篇_3d_02

4)这里的操作是当加载窗体的时候显示chart,所以有个窗体load事件。

C#之Chart篇_数据_03

5)双击后直接进入代码,当在代码中写Series时会出现红色波浪线,提示缺少相关命名空间之类的,点击【Series】就可以看到所需要的,添加就ok了

C#之Chart篇_3d_04

6)代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace MyChart
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//清除默认的series
chart1.Series.Clear();
//new 一个叫做【Strength】的系列
Series Strength = new Series("力量");
//设置chart的类型,这里为柱状图
Strength.ChartType = SeriesChartType.Column;
//给系列上的点进行赋值,分别对应横坐标和纵坐标的值
Strength.Points.AddXY("A", "90");
Strength.Points.AddXY("B","88");
Strength.Points.AddXY("C", "60");
Strength.Points.AddXY("D", "93");
Strength.Points.AddXY("E", "79");
Strength.Points.AddXY("F", "85");
//把series添加到chart上
chart1.Series.Add(Strength);

}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

7)效果图

C#之Chart篇_3d_05

2.两个Series

1)右击项目名,【添加】一个windows窗体。然后的话步骤和前面一样,这里就不多说了

2)简单粗暴上代码

using System; 

using System.Collections.Generic; 

using System.ComponentModel; 

using System.Data; 

using System.Drawing; 

using System.Linq; 

using System.Text; 

using System.Windows.Forms; 

using System.Windows.Forms.DataVisualization.Charting;

namespace MyChart 

public partial class Form2 : Form 

public Form2() 

InitializeComponent(); 

}

private void Form2_Load(object sender, EventArgs e)
{

chart1.Series.Clear();
Series Strength = new Series("力量");
Series Speed= new Series("速度");

Strength.ChartType = SeriesChartType.Column;
Strength.IsValueShownAsLabel = true;
Strength.Color = System.Drawing.Color.Cyan;

Speed.ChartType = SeriesChartType.Spline;
Speed.IsValueShownAsLabel = true;

chart1.ChartAreas[0].AxisX.MajorGrid.Interval =0.5;
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled =true;
//chart1.ChartAreas[0].Area3DStyle.Enable3D = true;
chart1.ChartAreas[0].AxisX.IsMarginVisible = true;
chart1.ChartAreas[0].AxisX.Title = "英雄";
chart1.ChartAreas[0].AxisX.TitleForeColor = System.Drawing.Color.Crimson;

chart1.ChartAreas[0].AxisY.Title = "属性";
chart1.ChartAreas[0].AxisY.TitleForeColor = System.Drawing.Color.Crimson;
chart1.ChartAreas[0].AxisY.TextOrientation = TextOrientation.Horizontal;



Strength.LegendText = "力气";
Strength.Points.AddXY("A", "90");
Strength.Points.AddXY("B", "88");
Strength.Points.AddXY("C", "60");
Strength.Points.AddXY("D", "93");
Strength.Points.AddXY("E", "79");
Strength.Points.AddXY("F", "85");

Speed.Points.AddXY("A", "120");
Speed.Points.AddXY("B", "133");
Speed.Points.AddXY("C", "100");
Speed.Points.AddXY("D", "98");
Speed.Points.AddXY("E", "126");
Speed.Points.AddXY("F", "89");

//把series添加到chart上
chart1.Series.Add(Speed);
chart1.Series.Add(Strength);

}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

}

3)效果

C#之Chart篇_sql_06

4)熟悉常用属性和方法

(1)Series对象

​Series Strength = new Series("力量"); 
Series Speed= new Series("速度");​

设置series类型

​Strength.ChartType = SeriesChartType.Column; 
Speed.ChartType = SeriesChartType.Spline;​

是否把值当做标签展示(默认false)

​Speed.IsValueShownAsLabel = true;​

设置series颜色

​Strength.Color = System.Drawing.Color.Cyan;​

给series上的点赋值
Strength.Points.AddXY("A", "90");
Strength.Points.AddXY("B", "88");
Strength.Points.AddXY("C", "60");
  • 1
  • 2
  • 3

(2)ChartArea(就是我们看到的区域)

以3D形式展示

​chart1.ChartAreas[0].Area3DStyle.Enable3D = true;​

设置坐标轴标题
chart1.ChartAreas[0].AxisY.Title = "属性";
chart1.ChartAreas[0].AxisY.TitleForeColor = System.Drawing.Color.Crimson;
chart1.ChartAreas[0].AxisY.TextOrientation = TextOrientation.Horizontal;
设置网格间隔(这里设成0.5,看得更直观一点)
chart1.ChartAreas[0].AxisX.MajorGrid.Interval =0.5;
  • 1

3.库存波动

1)主代码

using Daisy.Common.McsClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace BIZWhOnhandQuery
{
public partial class MainForm : Mes.ControlsEx.ExtendForm.BaseForm
{
public string QuerySql01 = string.Empty;
public MainForm()
{
InitializeComponent();
}

private void navigatorEx1_OnQuery(object sender, Mes.Core.ApplicationObject.SystemNavigatorClickedEventArgs e)
{
try
{
QueryForm qf = new QueryForm();
qf.StartPosition = FormStartPosition.CenterScreen;
qf.ShowDialog();
if (qf.DialogResult == System.Windows.Forms.DialogResult.OK)
{
QuerySql01 = qf.QuerySql01;
this.chart1.Series.Clear();//先将series清除
//设置X/Y样式
chart1.ChartAreas[0].AxisY.Title = Mes.Core.Utility.StrUtil.Translate("数量");
chart1.ChartAreas[0].AxisX.Title = Mes.Core.Utility.StrUtil.Translate("日期");
chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 0;
chart1.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
chart1.ChartAreas[0].AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
// chart1.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
// chart1.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;
chart1.Titles[0].Text = "";

//设置char样式

this.chart1.Series.Add(Mes.Core.Utility.StrUtil.Translate("数量"));
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].MarkerColor = Color.Black;//设置标志
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].MarkerSize = 1;
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].MarkerStyle = MarkerStyle.Square;
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].IsValueShownAsLabel = false;//是否显示值
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].ChartType = SeriesChartType.Spline;//设置显示样式
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].BorderWidth = 1;
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].Color = Color.Blue;
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].ToolTip = Mes.Core.Utility.StrUtil.Translate("原材料数量");
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].YValueType = ChartValueType.Double;

McsDataReader reader = (McsDataReader)Mes.Core.Service.DatabaseAccessService.execute(qf.QuerySql01, Mes.Core.Service.ReturnType.RESULTSET);
if (reader.rowNumber > 0)
{
while (reader.Read())
{
chart1.Series[Mes.Core.Utility.StrUtil.Translate("数量")].Points.AddXY(reader.getString(1), reader.getString(0));
}
}
chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].Axes[1].LabelStyle.Format = "N0";
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
}

2)效果图

C#之Chart篇_sql_07

4.设备使用分析

查询设备在某个时间范围内的使用频率(可按日或周或月),点击一条记录可以看到对应的曲线。该报表的设备包括有记录已经维护基础数据的设备,也包括有记录还没有维护基础数据的设备

1)功能代码结构

C#之Chart篇_sql_08

2)MainForm

C#之Chart篇_数据_09

using Daisy.Common.McsClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BIZDeviceUseAnalysis
{
public partial class MainForm : Mes.ControlsEx.ExtendForm.BaseForm
{
QueryForm form = null;
public MainForm()
{
InitializeComponent();
}

private void navigatorEx1_OnQuery(object sender, Mes.Core.ApplicationObject.SystemNavigatorClickedEventArgs e)
{
form = new QueryForm();
form.ShowDialog();
if (form.DialogResult == System.Windows.Forms.DialogResult.OK)
{
GetData();

}
}
void GetData()
{
try
{
AddColumns(); //获取列名
AddDataInGridView();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void AddColumns()
{
try
{
List<string> columnList = new List<string>();
McsDataReader reader = (McsDataReader)Mes.Core.Service.DatabaseAccessService.execute(form.colsql, Mes.Core.Service.ReturnType.RESULTSET);
//McsDataReader reader01 = (McsDataReader)Mes.Core.Service.DatabaseAccessService.execute(form.QuerySql, Mes.Core.Service.ReturnType.RESULTSET);
while (reader.Read())
{
string calendar = reader.getString(0);

if (form.Kind == 1)
{
calendar = DateTime.Parse(calendar).ToString("yyyy-MM-dd");

}
//if (form.Kind == 2)
//{
// calendar = DateTime.Parse(calendar).ToString("yyyy-iw");

//}
//if (form.Kind == 3)
//{
// calendar = DateTime.Parse(calendar).ToString("yyyy-MM");

//}
columnList.Add(calendar);


}


if (columnList.Count == 0)
return;

int count = this.dataGridViewEx1.Columns.Count;
for (int j = count - 1; j > 2; j--)
{
this.dataGridViewEx1.Columns.RemoveAt(j);
}

for (int i = 0; i < columnList.Count; i++)
{
Mes.ControlsEx.DataGridViewTextBoxExColumn Column = new Mes.ControlsEx.DataGridViewTextBoxExColumn(this.components);
Column.DataType = Mes.Core.ApplicationObject.DataGridViewColumnDataType.NONE;
Column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.NotSet;
Column.SortMode = DataGridViewColumnSortMode.Automatic;
Column.HeaderText = Mes.Core.Utility.StrUtil.ValueToString(columnList[i]);
//Column.HeaderText = DateTime.Parse(Mes.Core.Utility.StrUtil.ValueToString(columnList[i])).ToString("yyyy-MM-dd");
Column.ToolTipText = Mes.Core.Utility.StrUtil.ValueToString(columnList[i]);
Column.IgnoreValueChanged = false;
Column.IndexOrder = 0;
Column.IsShowTimePick = false;
Column.LovParameter = null;
Column.MustBeInput = false;
Column.MustBeInputErrorMsg = "";
Column.Name = "Col" + Mes.Core.Utility.StrUtil.ValueToString(columnList[i]);
Column.Tag = columnList[i];
Column.PopType = Mes.Core.ApplicationObject.DataGridViewColumnPopType.NONE;
Column.RangeEndValue = "";
Column.RangeStartValue = "";
Column.ReadOnly = true;
Column.RegString = "";
Column.ValidationErrorMsg = "";
Column.ValidationType = Mes.Core.ApplicationObject.DataGridViewColumnValidationType.NONE;
Column.Width = 150;
Column.Resizable = DataGridViewTriState.False;
Column.SortMode = DataGridViewColumnSortMode.NotSortable;
this.dataGridViewEx1.Columns.Add(Column);
}
}
catch (Exception ex)
{
throw ex;
}
}

void AddDataInGridView()
{
try
{
this.dataGridViewEx1.Rows.Clear();

GetDataBySQL(form.QuerySql, 1);


this.statusStripBarEx1.ShowMessage(Mes.Core.Utility.StrUtil.Translate("共查询到" + dataGridViewEx1.RowCount + "条数据"));
//FillChart();//填充图表
}
catch (Exception ex)
{
throw ex;
}
}
void GetDataBySQL(string sql, int type)
{
try
{
int rowIndex = -1;

McsDataReader reader = (McsDataReader)Mes.Core.Service.DatabaseAccessService.execute(sql, Mes.Core.Service.ReturnType.RESULTSET);

while (reader.Read())
{
string calendar = reader.getString(2);

if (form.Kind == 1)
{
// calendar = DateTime.Parse(calendar).ToShortDateString();
calendar = DateTime.Parse(calendar).ToString("yyyy-MM-dd");
}
string mac= reader.getString(0);
string deviceCode = reader.getString(3);
string deviceName = reader.getString(4);

string value=reader.getString(1);


bool IsExist = false;

for (int i = 0; i < this.dataGridViewEx1.Rows.Count; i++)
{
string rowValue = Mes.Core.Utility.StrUtil.ValueToString(this.dataGridViewEx1.Rows[i].Cells[0].Value);


if (rowValue == mac)
{
rowIndex = i;
IsExist = true;
break;
}
}
if (IsExist)
{

FindCellForValue(rowIndex, value, calendar,deviceCode,deviceName);

}
else
{

string text = string.Empty;
if (type == 1)
text = mac;
// MessageBox.Show("mac:" + mac);
rowIndex = this.dataGridViewEx1.Rows.Add(text);
this.dataGridViewEx1.Rows[rowIndex].Cells[1].Value = deviceCode;
this.dataGridViewEx1.Rows[rowIndex].Cells[2].Value = deviceName;
FindCellForValue(rowIndex, value, calendar, deviceCode, deviceName);


}

}


}
catch (Exception ex)
{
throw ex;
}
}

void FindCellForValue(int rowIndex, string Value, string ScanItem,string deviceCode,string deviceName)
{
for (int i = 3; i < this.dataGridViewEx1.Columns.Count; i++)
{
if (ScanItem == this.dataGridViewEx1.Columns[i].HeaderText)
{
this.dataGridViewEx1.Rows[rowIndex].Cells[i].Value =Value;




}
}

}
void FillChart(int rowIndex)
{
int FixColumnIndex = 1;


try
{

chart1.Series.Clear();

//chart1.ChartAreas[0].Axes[1].Maximum = 1.3;
chart1.ChartAreas[0].Axes[1].Minimum = 0;

//设置网格线
chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Black;
chart1.ChartAreas[0].AxisX.MajorGrid.Interval = 0;//网格间隔
chart1.ChartAreas[0].AxisX.MinorGrid.Interval = 0;
chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Black;
chart1.ChartAreas[0].AxisY.MajorGrid.Interval = 0;
chart1.ChartAreas[0].AxisY.MinorGrid.Interval = 0;
chart1.ChartAreas[0].AxisY.Title = Mes.Core.Utility.StrUtil.Translate("使用次数");
chart1.ChartAreas[0].AxisX.Title = Mes.Core.Utility.StrUtil.Translate("使用日期");
//折线图
//for (int i = 0; i < this.datagridviewex1.rowcount; i++)
//{
int[] yValues1 = new int[this.dataGridViewEx1.Columns.Count - FixColumnIndex];
string[] xValues1 = new string[this.dataGridViewEx1.Columns.Count - FixColumnIndex];

//int[]yValues1=new int[0];
//string[] xValues1=new string[0] ;
chart1.Series.Add(Mes.Core.Utility.StrUtil.ValueToString(this.dataGridViewEx1.Rows[rowIndex].Cells[0].Value));
//设置图片类型
chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
//设置默认轴
chart1.Series[0].IsVisibleInLegend = true;
//设置图例显示
chart1.Series[0].IsValueShownAsLabel = true;
//设置轴显示
//chart1.Series[i].Label = "#VAL{P}";
//设置线条粗细
chart1.Series[0].BorderWidth = 3;

int count = 0;

for (int j = 3; j < this.dataGridViewEx1.ColumnCount; j++)
{
int _value = 0;
string value = Mes.Core.Utility.StrUtil.ValueToString(this.dataGridViewEx1.Rows[rowIndex].Cells[j].Value);
string text = Mes.Core.Utility.StrUtil.ValueToString(this.dataGridViewEx1.Columns[j].HeaderText);

xValues1[count] = text;

//柱状图数据添加
if (value!= string.Empty)
{
_value =Convert.ToInt32(value);
yValues1[count] = _value;
}
else
{
_value = 0;
yValues1[count] = _value;
}
chart1.Series[0].Points.DataBindXY(xValues1,yValues1);
count += 1;
// }
}

}
catch (Exception ex)
{
throw ex;
}
}

private void navigatorEx1_Load(object sender, EventArgs e)
{
this.navigatorEx1.AddButton(Mes.Core.Utility.StrUtil.Translate("设备基础资料维护"), MAINTAIN_DEVICE);
}

//设备基础资料维护窗口
private void MAINTAIN_DEVICE(object sender, EventArgs e)
{
BaseInfoForm bi = new BaseInfoForm();
bi.ShowDialog();

}

private void dataGridViewEx1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int currentIndex = e.RowIndex;

if (e.RowIndex < 0)
return;
if (this.dataGridViewEx1.Rows.Count > 0 && e.RowIndex < this.dataGridViewEx1.Rows.Count) {

FillChart(currentIndex);

}
}

}
}

3)QueryForm

C#之Chart篇_3d_10

using Mes.ControlsEx;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BIZDeviceUseAnalysis
{
public partial class QueryForm : Mes.ControlsEx.ExtendForm.QueryForm
{
public int Kind = 0;
public string colsql = string.Empty;

public QueryForm()
{
InitializeComponent();
}

private void QueryForm_Load(object sender, EventArgs e)
{


}

private void cbByDay_CheckedChanged(object sender, EventArgs e)
{
CheckChangeEvent(sender);
}

private void cbByWeek_CheckedChanged(object sender, EventArgs e)
{
CheckChangeEvent(sender);
}

private void cbByMonth_CheckedChanged(object sender, EventArgs e)
{
CheckChangeEvent(sender);
}

private void CheckChangeEvent(object sender)
{
try
{
if ((sender as CheckBoxEx).Checked == true)
{
foreach (CheckBoxEx chk in (sender as CheckBoxEx).Parent.Controls)
{
if (chk != sender)
{
chk.Checked = false;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void QueryForm_OnQuery(object sender, EventArgs e)
{
string startTimeStr = string.Empty;
string endTimeStr = string.Empty;
string condition = string.Empty;
string mac = string.Empty;

//Mac
string txtMac = this.tbMac.Text.Trim();
List<string> macList = this.tbMac.MultirowValue;
if (macList != null & macList.Count > 0)
{
mac = " AND mac in (" + Mes.Core.Utility.StrUtil.BuildPara(macList) + ") ";
}
else
{
if (txtMac != string.Empty)
{
mac = " AND mac " + Mes.Core.Utility.StrUtil.ProcInput(txtMac, false);
}
}

//查询日期从
string txtDailyWorkFrom = this.tbDateFrom.Text.Trim();
if (txtDailyWorkFrom == string.Empty)
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("查询日期从不能为空"));
return;
}
else
{
startTimeStr = txtDailyWorkFrom;
}
//查询日期到
string txtDailyWorkTo = this.tbDateTo.Text.Trim();
if (txtDailyWorkTo == string.Empty)
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("查询日期到不能为空"));
return;
}
else
{
endTimeStr = txtDailyWorkTo;
}
TimeSpan ts;
try
{
DateTime startTime = DateTime.ParseExact(txtDailyWorkFrom, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture);
DateTime endTime = DateTime.ParseExact(txtDailyWorkTo, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture);
ts = endTime - startTime;
}
catch
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("时间格式不正确"));
return;
}

//日报
if (this.cbByDay.Checked)
{
if (ts.TotalDays > 30)
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("查询日期从到查询日期到不能超过一个月"));
return;
}

Kind = 1;
condition += "GROUP BY mac, to_char(bmr.creation_date, 'yyyy-mm-dd'), device_code,device_name";
condition += " ORDER BY mac, to_char(bmr.creation_date, 'yyyy-mm-dd') ,device_code,device_name ";
this.QuerySql = Sql.Core.GetMainSqlByDay(startTimeStr, endTimeStr,mac,condition);
colsql = Sql.Core.GetColumnByDay(startTimeStr, endTimeStr);

}

//周报
if (this.cbByWeek.Checked)
{
if (ts.TotalDays > 13 * 7)
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("查询日期从到查询日期到不能超过13周"));
return;
}

Kind = 2;
condition += "GROUP BY mac, to_char(trunc(bmr.creation_date),'yyyy-iw'), device_code,device_name";
condition += " ORDER BY mac, to_char(trunc(bmr.creation_date),'yyyy-iw') ,device_code,device_name ";
this.QuerySql = Sql.Core.GetMainSqlByWeek(startTimeStr, endTimeStr,mac, condition);
colsql = Sql.Core.GetColumnByWeek(startTimeStr, endTimeStr);

}

//月报
if (this.cbByMonth.Checked)
{
if (ts.TotalDays > 365 * 2)
{
MessageBox.Show(Mes.Core.Utility.StrUtil.Translate("查询日期从到查询日期到不能超过2年"));
return;
}

Kind = 3;
condition += "GROUP BY mac, to_char(trunc(bmr.creation_date),'yyyy-mm'), device_code,device_name";
condition += " ORDER BY mac, to_char(trunc(bmr.creation_date),'yyyy-mm') ,device_code,device_name ";
this.QuerySql = Sql.Core.GetMainSqlByMonth(startTimeStr, endTimeStr, mac,condition);
colsql = Sql.Core.GetColumnByMonth(startTimeStr, endTimeStr);

}
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();

}

private void QueryForm_OnCancelQuery(object sender, EventArgs e)
{
this.tbMac.Text = this.tbDateFrom.Text = this.tbDateTo.Text = string.Empty;
}
}
}

5)BaseInfoForm

C#之Chart篇_数据_11

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BIZDeviceUseAnalysis
{
public partial class BaseInfoForm : Mes.ControlsEx.ExtendForm.BaseForm
{
public BaseInfoForm()
{
InitializeComponent();
}

private void navigatorEx1_OnQuery(object sender, Mes.Core.ApplicationObject.SystemNavigatorClickedEventArgs e)
{
BaseInfoQueryForm bio = new BaseInfoQueryForm();
bio.StartPosition = FormStartPosition.CenterScreen;
bio.ShowDialog();
if (bio.DialogResult == System.Windows.Forms.DialogResult.OK) {
this.navigatorEx1.QuerySql = bio.QuerySql;

}
}

private void navigatorEx1_OnSave(object sender, Mes.Core.ApplicationObject.SystemNavigatorClickedEventArgs e)
{
if (this.dataGridViewEx1.AddedRows.Count > 0)//新增行大于0
{
this.navigatorEx1.InsertSqlList = this.SaveOrUpdate(this.dataGridViewEx1.AddedRows, true);//返回值为True

}
if (this.dataGridViewEx1.ChangedRows.Count > 0)//修改行大于0
{
this.navigatorEx1.UpdateSqlList = this.SaveOrUpdate(this.dataGridViewEx1.ChangedRows, false);//返回值为False
}
}
private List<string> SaveOrUpdate(List<string> list, bool flag)
{
List<string> InsertOrUpdatelist = new List<string>();
for (int i = 0; i < list.Count; i++)
{
int row_index = Convert.ToInt32(list[i]);
List<string> lis = new List<string>();
if (flag)//如果返回值为True
{
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceCode.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceType.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceName.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColMacAddress.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColFloor.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColAdminDepartment.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColEnable.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDescription.Name].Value));

string template = Mes.Core.Utility.StrUtil.BuildPara(lis);

string sql = "{? = call biz_device_pck.insert_rows_for_ui(" + template + ")}";
InsertOrUpdatelist.Add(sql);
}
else
{
// lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[0].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceID.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceCode.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceType.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDeviceName.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColMacAddress.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColFloor.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColAdminDepartment.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColEnable.Name].Value));
lis.Add(Mes.Core.Utility.StrUtil.ValueToString(dataGridViewEx1.Rows[row_index].Cells[this.ColDescription.Name].Value));
string template = Mes.Core.Utility.StrUtil.BuildPara(lis);

string sql = "{? = call biz_device_pck.update_rows_for_ui(" + template + ")}";
InsertOrUpdatelist.Add(sql);
}
}
return InsertOrUpdatelist;
}
}
}
}

6)BaseInfoQueryForm

C#之Chart篇_sql_12

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BIZDeviceUseAnalysis
{
public partial class BaseInfoQueryForm : Mes.ControlsEx.ExtendForm.QueryForm
{
public BaseInfoQueryForm()
{
InitializeComponent();
}

private void BaseInfoQueryForm_OnQuery(object sender, EventArgs e)
{
this.QuerySql = Sql.Core.GetDeviceInfo();

// 设备编码
string txtDeviceCode = this.tbDeviceCode.Text.Trim();
List<string> deviceCodeList = this.tbDeviceCode.MultirowValue;
if (deviceCodeList != null & deviceCodeList.Count > 0)
{
this.QuerySql += " AND device_code in (" + Mes.Core.Utility.StrUtil.BuildPara(deviceCodeList) + ") ";
}
else
{
if (txtDeviceCode != string.Empty)
{
this.QuerySql += " AND device_code " + Mes.Core.Utility.StrUtil.ProcInput(txtDeviceCode, false);
}
}
//设备名称
string txtDeviceName = this.tbDeviceName.Text.Trim();
List<string> deviceNameList = this.tbDeviceName.MultirowValue;
if (deviceNameList != null & deviceNameList.Count > 0)
{
this.QuerySql += " AND device_name in (" + Mes.Core.Utility.StrUtil.BuildPara(deviceNameList) + ") ";
}
else
{
if (txtDeviceName != string.Empty)
{
this.QuerySql += " AND device_name " + Mes.Core.Utility.StrUtil.ProcInput(txtDeviceName, false);
}
}
//mac地址
string txtMac = this.tbMacAddress.Text.Trim();
List<string> macList = this.tbMacAddress.MultirowValue;
if (macList != null & macList.Count > 0)
{
this.QuerySql += " AND mac_address in (" + Mes.Core.Utility.StrUtil.BuildPara(macList) + ") ";
}
else
{
if (txtMac != string.Empty)
{
this.QuerySql += " AND mac_address " + Mes.Core.Utility.StrUtil.ProcInput(txtMac, false);
}
}
//部门
string txtDepartment = this.tbDepartment.Text.Trim();
List<string> departmentList = this.tbDepartment.MultirowValue;
if (departmentList != null & departmentList.Count > 0)
{
this.QuerySql += " AND admin_department in (" + Mes.Core.Utility.StrUtil.BuildPara(departmentList) + ") ";
}
else
{
if (txtDepartment != string.Empty)
{
this.QuerySql += " AND admin_department " + Mes.Core.Utility.StrUtil.ProcInput(txtDepartment, false);
}
}

this.QuerySql += " order by device_code,device_name";
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}

private void BaseInfoQueryForm_OnCancelQuery(object sender, EventArgs e)
{
this.tbDeviceCode.Text = this.tbDeviceName.Text =
this.tbMacAddress.Text = this.tbDepartment.Text = string.Empty;
}
}
}

7)SQL

using Mes.ControlsEx;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BIZDeviceUseAnalysis.Sql
{
class Core
{
//按天
public static string GetMainSqlByDay(string startTime, string endTime,string mac,string condition)
{

string sql = @"
WITH baseInfoRecord AS(SELECT mac, SUM(counting) total, to_char(bmr.creation_date, 'yyyy-mm-dd'), device_code,device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac=bdi.mac_address
"+mac+@"
"+condition+@"
)
,
noBaseInfo AS(SELECT DISTINCT mac, SUM(counting) total, to_char(bmr.creation_date, 'yyyy-mm-dd'),''device_code,''device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac NOT IN (SELECT mac_address FROM biz_device_info)
" + mac + @"
" + condition + @" )

SELECT * FROM baseInfoRecord
UNION ALL
SELECT * FROM noBaseInfo";
return sql;

}

public static string GetColumnByDay(string startTime, string endTime)
{
string sql = @"SELECT DISTINCT to_char(bmr.creation_date,'yyyy-mm-dd')
FROM biz_mac_record bmr
WHERE bmr.creation_date >= to_date('" + startTime+ @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
ORDER BY to_char(bmr.creation_date,'yyyy-mm-dd')";
return sql;

}
//按周
public static string GetMainSqlByWeek(string startTime, string endTime, string mac, string condition)
{

string sql = @"
WITH baseInfoRecord AS(SELECT mac, SUM(counting) total, to_char(trunc(bmr.creation_date),'yyyy-iw'), device_code,device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac=bdi.mac_address
" + mac + @"
" + condition + @"
)
,
noBaseInfo AS(SELECT DISTINCT mac, SUM(counting) total, to_char(trunc(bmr.creation_date),'yyyy-iw'),''device_code,''device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac NOT IN (SELECT mac_address FROM biz_device_info)
" + mac + @"
" + condition + @" )

SELECT * FROM baseInfoRecord
UNION ALL
SELECT * FROM noBaseInfo";
return sql;

}
public static string GetColumnByWeek(string startTime, string endTime)
{
string sql = @"SELECT DISTINCT to_char(bmr.creation_date,'yyyy-iw')
FROM biz_mac_record bmr
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
ORDER BY to_char(bmr.creation_date,'yyyy-iw')";
return sql;

}
//按月
public static string GetMainSqlByMonth(string startTime, string endTime, string mac, string condition)
{
string sql = @"
WITH baseInfoRecord AS(SELECT mac, SUM(counting) total, to_char(trunc(bmr.creation_date),'yyyy-mm'), device_code,device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac=bdi.mac_address
" + mac + @"
" + condition + @"
)
,
noBaseInfo AS(SELECT DISTINCT mac, SUM(counting) total, to_char(trunc(bmr.creation_date),'yyyy-mm'),''device_code,''device_name
FROM biz_mac_record bmr, (SELECT 1 AS counting FROM dual),biz_device_info bdi
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
AND bmr.mac NOT IN (SELECT mac_address FROM biz_device_info)
" + mac + @"
" + condition + @" )

SELECT * FROM baseInfoRecord
UNION ALL
SELECT * FROM noBaseInfo";

return sql;

}
public static string GetColumnByMonth(string startTime, string endTime)
{
string sql = @"SELECT DISTINCT to_char(bmr.creation_date,'yyyy-mm')
FROM biz_mac_record bmr
WHERE bmr.creation_date >= to_date('" + startTime + @"', 'yyyy-mm-dd')
AND bmr.creation_date <= to_date('" + endTime + @"', 'yyyy-mm-dd')
ORDER BY to_char(bmr.creation_date,'yyyy-mm')";
return sql;
}
//设备基础信息
public static string GetDeviceInfo()
{
string sql = @"select * from biz_device_info where 1=1";
return sql;
}
}
}

8)运行效果

按日

C#之Chart篇_sql_13

按周

C#之Chart篇_sql_14