C# Chart控制元件的使用總結
最近一直在畫圖表,總結一下,方便以後參考。
1、 圖表的各種屬性
對不起,我太懶了,詳情看如下的連結吧。。。。
http://blog.sina.com.cn/s/blog_621e24e20101cp64.html
2、關於圖表的資料來源
(1)來自SQL server
此時就可以用查詢語句,來獲取你要用到的資料
(要引用如下名稱空間:
using System.Data.SqlClient;
usingSystem.Windows.Forms.DataVisualization.Charting;)
SqlConnection mycon;
SqlDataAdaptermyda;
DataSet myds;
stringcon, sql;
con ="Server=(local);Database=OutputDB;Trusted_Connection=SSPI";
sql = "select * fromMachineStsTable where " +"日期>= " +"'" + dateTimePicker1.Value.ToString("yyyyMMdd")+ "'"+"AND日期<= " +"'" +dateTimePicker2.Value.ToString("yyyyMMdd ")+"'";
mycon =newSqlConnection(con);
mycon.Open();
myda =newSqlDataAdapter(sql,con);
此時,chart1的資料來源有3種繫結方式。
方式一:直接將要查詢的那張表的表名繫結上去
myds=newDataSet();
myda.Fill(myds,"MachineStsTable");
mycon.Close();
chart1.DataSource= myds.Tables["MachineStsTable"];
對應的圖表X軸、Y軸繫結資料如下:
圖1表MachineStsTable的詳情
序列1(Series[0])的繫結方式如下:
chart1.Series[0].XValueMember= "日期";
chart1.Series[0].YValueMembers= "全生產線";
chart1.Series[0].LegendToolTip ="全生產線";//滑鼠放到系列上出現的文字
chart1.Series[0].LegendText ="全生產線";//系列名字
chart1.Series[0].XValueType =ChartValueType.Date;
chart1.Series[0].ChartType= SeriesChartType.Line;
剩下的其它序列繫結同上。。
由此看出,此種方式只適合要顯示的序列比較少的情況。。還是建議用方式2,將表複製到DataTable的例項中。
方式二:用新定義的DataTable型別的dt來繫結
DataTable dt =newDataTable("MachineStsTable");
myda.Fill(dt);
mycon.Close();
chart1.DataSource = dt;
注:此時是因為藉助myda,dt已經將整個表複製了過來,不然還要人為新增表的內容。。。
對應的圖表X軸、Y軸繫結資料如下:
for(inti = 0; i < dt.Columns.Count -2; i++)
{
chart1.Series[i].XValueMember = dt.Columns[1].ColumnName;
chart1.Series[i].YValueMembers = dt.Columns[i + 2].ColumnName;
chart1.Series[i].LegendToolTip = dt.Columns[i + 2].ColumnName;//滑鼠放到系列上出現的文字
chart1.Series[i].LegendText = dt.Columns[i + 2].ColumnName;//系列名字
chart1.Series[i].XValueType =ChartValueType.DateTime;
chart1.Series[i].ChartType =SeriesChartType.StackedColumn;
}
這種就非常適合Y軸種類特別多的情況。。。。一個迴圈,搞定所有。。。
方式三:用類似chart1.Series[0].Points.DataBindXY(iXAxis,fTargetOT);中的DataBindXY(X,Y)來繫結資料。。其中,X是一個陣列,Y也是陣列,在繫結之前需要對陣列中的每個元素賦值,例子如下(同樣是上述圖1中的表格):
DataTable dt =newDataTable("MachineStsTable");
myda.Fill(dt);
mycon.Close();
//chart1.DataSource = dt;(這句話就不要了,因為下面會一一賦值)
if (dt.Rows.Count == 0)
{
return;
}
DateTime[] iXAxis =newDateTime[dt.Rows.Count];
DateTime[] dtXAxis =newDateTime[dt.Rows.Count];
float[]fDownTime =newfloat[dt.Rows.Count];//全生產線
float[]fDownTime1 =newfloat[dt.Rows.Count];//繞線機
float[]fDownTime2 =newfloat[dt.Rows.Count];
………………直至
float[]fDownTime10=newfloat[dt.Rows.Count];
for(inti = 0; i < dt.Rows.Count; i++)
{
// dtXAxis[i] =(DateTime)dt.Rows[i][1];
iXAxis[i] = (DateTime)dt.Rows[i][1];
fDownTime[i]=float.Parse(dt.Rows[i][2].ToString());
fDownTime1[i]=float.Parse(dt.Rows[i][3].ToString());
fDownTime2[i]=float.Parse(dt.Rows[i][4].ToString());
………………直至
fDownTime10[i]=float.Parse(dt.Rows[i][12].ToString());
}
chart1.Series[0].XValueType =ChartValueType.DateTime;
chart1.Series[0].Points.DataBindXY(iXAxis, fDownTime);
chart1.Series[0].LegendToolTip ="全生產線";//滑鼠放到系列上出現的文字
chart1.Series[0].LegendText ="全生產線";//系列名字
chart1.Series[0].ChartType =SeriesChartType.StackedColumn;
另外的10個序列的繫結方式如上述序列1(Series[0])。。
此種方式,適合,讀過來的資料需要進行處理的情況,如果不需要處理,而且列特別多,則不建議使用這種方式,用方式二比較方便。
(2)來自Web Api。。
這種要跟寫Web Api的工程師對接,知道呼叫方式,才能按照他返回的資料格式,來繫結資料來源。方式同來源於SQL Server。。。
此時也建議根據要顯示的情況,建立一個DataTable,再對錶的列和行進行賦值,再按(1)中的方式二來進行繫結。大致例子如下:
DateTime[] dtXAxis =newDateTime[device_faultdescs.Count];
System.Data.DataTable myTab =newSystem.Data.DataTable("His");
myTab.Columns.Add("ID",Type.GetType("System.Int32"));
myTab.Columns[0].AutoIncrement =true;
myTab.Columns[0].Unique =true;
myTab.Columns[0].AutoIncrementSeed = 1;
myTab.Columns[0].AutoIncrementStep = 1;
myTab.Columns.Add("Xvalue",Type.GetType("System.DateTime"));
myTab.Columns.Add("停機型別",Type.GetType("System.String"));
//給要新增的列,動態新增列名,以及對應列下的資料型別。。。
for (intj = 0; j < device_faultdescs[0].desc.Count; j++)
{
myTab.Columns.Add(device_faultdescs[0].desc[j].desc,Type.GetType("System.Double"));
}
for(inti = 0; i < device_faultdescs.Count; i++)
{
DataRow newRow = myTab.NewRow();
for(intj = 0; j < device_faultdescs[i].desc.Count; j++)
{
newRow[device_faultdescs[i].desc[j].desc] =Math.Round(device_faultdescs[i].desc[j].downtime,2);
newRow["ID"] = i;
newRow["Xvalue"] =DateTime.Parse(Program.mainForm.dateTimePicker1.Value.ToString("yyyy-MM-dd"));
newRow["停機型別"] = device_faultdescs[i].devicename;
// myTab.Rows.Add(new object[] { null,scraps[i].dt, scraps[i].detail[j].count });
// myTab.Rows[i]
}
myTab.Rows.Add(newRow);
}
//動態建立序列在chart2上
chart2.DataSource = myTab;
chart2.Series.Clear();
for (inti = 0; i < myTab.Columns.Count-3; i++)
{
chart2.Series.Add(i.ToString());//新增
}
for (intj = 0; j < myTab.Columns.Count - 3; j++)
{
chart2.Series[j].XValueMember = myTab.Columns[2].ColumnName;
chart2.Series[j].YValueMembers = myTab.Columns[j + 3].ColumnName;
chart2.Series[j].LegendToolTip =myTab.Columns[j + 3].ColumnName;//滑鼠放到系列上出現的文字
chart2.Series[j].LegendText = myTab.Columns[j + 3].ColumnName; //系列名字
chart2.Series[j].XValueType =ChartValueType.String;
chart2.Series[j].ChartType =SeriesChartType.StackedColumn;
}
(3)來自單獨的資料
動態新增序列,
chart3.Series.Clear();
Series seriesDownTime =newSeries("DownTime");//此時就新增一個序列,chart3.Series[0]
seriesDownTime.ChartType =SeriesChartType.Column;
//比如要新增的內容放在了陣列X和陣列Y中,則新增第一個值可以如下新增:
seriesDownTime.Points.AddXY(X[0],Y[0]);
下一個值與之類似,直到把很少的幾個點新增完成即可。。。
此種方式適合要顯示在圖表上的只有少量的幾個點,如果資料眾多,建議按集合來新增。
3、 常用的屬性
chart1.Series[0].ChartType =SeriesChartType.Line;//設定曲線型別
chart1.Series[0].XValueType =ChartValueType.DateTime;//設定X軸繫結值的型別
chart1.Series[0].LegendToolTip ="Target Output";//滑鼠放到系列上出現的文字
chart1.Series[0].LegendText ="Target Output";//系列名字
chart1.ChartAreas[0].AxisX.Minimum = 1;//座標最小值,這樣的話,X軸座標是從1開始
chart1.Series[0].IsValueShownAsLabel =true;//值作為標籤顯示在圖表中
chart1.Series[0].BorderWidth = 3;//設定線寬
chart1.ChartAreas[0].AxisX.Interval = 1;//設定X軸間距,這樣的話,就間距固定為1
double max = 120, min = 0;
chart1.ChartAreas[0].AxisY.Maximum = max;//設定Y軸最大值
chart1.ChartAreas[0].AxisY.Minimum = min; //設定Y軸最小值
大致就是這些,後續有什麼想起來的,再補充。。。
chart1.ChartAreas[0].AxisX.Title = "不良型別";
chart1.ChartAreas[0].AxisY.Title = "複檢個數";
chart1.ChartAreas[0].AxisY2.Title = "NG複檢百分比(%)";
//設定座標軸標題的字型
chart1.ChartAreas[0].AxisX.TitleFont = new Font("宋體",12F);
chart1.ChartAreas[0].AxisY.TitleFont = new Font("宋體", 12F);
chart1.ChartAreas[0].AxisY2.TitleFont = new Font("宋體", 12F);
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY2.MajorGrid.Enabled = false;
相關文章
- VS控制元件Chart的使用控制元件
- C# Chart控制元件,chart、Series、ChartArea曲線圖繪製的重要屬性C#控制元件
- VB.net chart 控制元件使用控制元件
- C# 索引器使用總結C#索引
- C#控制元件的閃爍問題解決方法總結C#控制元件
- C# async/await 使用總結C#AI
- FastReport報表控制元件使用技巧總結AST控制元件
- C#控制元件之Repeater控制元件使用C#控制元件
- ExpandableListView控制元件使用中一些小問題的總結View控制元件
- c# combobox控制元件的使用C#控制元件
- WPF控制元件庫總結控制元件
- C# 6.0 的新特性總結C#
- C# DevExpress控制元件Gridview和GridControl學習總結C#devExpress控制元件View
- C#總結(二)事件Event 介紹總結C#事件
- C#字串操作總結C#字串
- c# 練習總結C#
- C# 與 Java 的不同點總結C#Java
- 自定義控制元件總結和思考控制元件
- C#常用集合總結-2C#
- 在WPF中使用Winform中自帶的畫圖控制元件Chart,模擬動態更新資料ORM控制元件
- 分享一個 C# Winfrom 下的 OutlookBar 控制元件的使用C#控制元件
- Chart FX for Java Server控制元件下載及詳細介紹JavaServer控制元件
- 在Blazor中使用Chart.jsBlazorJS
- ListenalbeFuture的使用總結
- git的使用總結Git
- WebView的使用總結WebView
- cmake的使用總結
- JXCategoryView的使用總結GoView
- C#中常用的ToString()方法總結C#
- C#開發一應用的總結C#
- .NET的C# 學習經驗總結C#
- C#控制元件C#控制元件
- DevExpress控制元件學習總結 zdevExpress控制元件
- 5.Android(RecyclerView控制元件總結)AndroidView控制元件
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- C#讀寫檔案總結C#
- C#讀取Excel方法總結C#Excel
- C#解析JSON字串總結C#JSON字串