【DevExpress】將某列資料統計後按柱狀圖顯示
阿新 • • 發佈:2019-08-27
顯示結果預覽:
如上圖:將R15101裝置按FAULT_LEVEL中的FAULT/WARNING兩種結果統計後,以柱狀圖的形式顯示。
操作步驟:
(1)按指定條件將資料列表從資料庫中查出並用Linq語句將FAULT/WARNING的條數統計出來,再傳至客戶端。
int level_fault_count = fdcfaulttrxlist.Where(t=>t.FaultLevel=="FAULT").Count(); int level_warning_count = fdcfaulttrxlist.Where(t=>t.FaultLevel=="WARNING").Count();
(2)客戶端獲取資料後將列表繫結到GridView,再用DataTable中的資料對ChartControl進行畫圖
private void btnSearch_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { DataTable dt = new DataTable(); if (dtFrom.EditValue != null && dtTo != null&&gluResId.EditValue!=null&&dtFrom.EditValue.ToString()!=""&&dtTo.EditValue.ToString()!="" &&gluResId.EditValue.ToString()!="") { string sStartTime = CommonFunction.ToStandardTime((DateTime)dtFrom.EditValue, GlobalConstant.SYS_CONVERT_DATETIME_FORMAT); string sEndTime = CommonFunction.ToStandardTime((DateTime)dtTo.EditValue, GlobalConstant.SYS_CONVERT_DATETIME_FORMAT); string sResId = gluResId.EditValue.ToString(); chtSummary.Series.Clear(); BindGV(); } }
BindGV():
private bool BindGV() { if (dtFrom.EditValue == null || dtTo.EditValue == null) { return false; } if (gluResId.EditValue == null || gluResId.EditValue.ToString() == "") { DataTable dtResult = new DataTable(); dtResult.Columns.Add("PARA_DISPLAY_NAME"); dtResult.Columns.Add("FAULT_TIME"); dtResult.Columns.Add("DATA_CATEGORY"); dtResult.Columns.Add("SPEC_TYPE"); dtResult.Columns.Add("FAULT_TYPE"); dtResult.Columns.Add("FAULT_LEVEL"); dtResult.Columns.Add("DATA_STATUS"); dtResult.Columns.Add("PARA_VALUE"); dtResult.Columns.Add("TARGET"); dtResult.Columns.Add("USL"); dtResult.Columns.Add("UCL"); dtResult.Columns.Add("LCL"); dtResult.Columns.Add("LSL"); dtResult.Columns.Add("FAULT_DESC"); dtResult.Columns.Add("OPERATION_ID"); dtResult.Columns.Add("LOT_ID"); dtResult.Columns.Add("LOT_TYPE"); dtResult.Columns.Add("CASSETTE_SLOT"); dtResult.Columns.Add("SUBSTRATE_ID"); dtResult.Columns.Add("PRODUCT_ID"); dtResult.Columns.Add("RECIPE_ID"); dtResult.Columns.Add("STEP_ID"); dtResult.Columns.Add("MAIN_MODULE_ID"); dtResult.Columns.Add("CONTEXT_KEY"); dtResult.Columns.Add("INTERLOCK_FLAG"); dtResult.Columns.Add("COMPOSITE"); dtResult.Columns.Add("CMF_01"); dtResult.Columns.Add("CMF_02"); dtResult.Columns.Add("CMF_03"); dtResult.Columns.Add("CMF_04"); dtResult.Columns.Add("CMF_05"); dtResult.Columns.Add("CMF_06"); dtResult.Columns.Add("CMF_07"); dtResult.Columns.Add("CMF_08"); dtResult.Columns.Add("CMF_09"); dtResult.Columns.Add("CMF_10"); dtResult.Columns.Add("CMF_11"); dtResult.Columns.Add("CMF_12"); dtResult.Columns.Add("CMF_13"); dtResult.Columns.Add("CMF_14"); dtResult.Columns.Add("CMF_15"); dtResult.Columns.Add("CMF_16"); dtResult.Columns.Add("CMF_17"); dtResult.Columns.Add("CMF_18"); dtResult.Columns.Add("CMF_19"); dtResult.Columns.Add("CMF_20"); dtResult.Columns.Add("CREATE_USER_ID"); dtResult.Columns.Add("CREATE_TIME"); dtResult.Columns.Add("UPDATE_USER_ID"); dtResult.Columns.Add("UPDATE_TIME"); dtResult.Columns.Add("LEVEL_FAULT_COUNT"); dtResult.Columns.Add("LEVEL_WARNING_COUNT"); dtResult.Columns.Add("RAWID"); dtResult.Columns.Add("RES_ID"); dtResult.Columns.Add("DCP_ID"); int[] iaWidth = new int[dtResult.Columns.Count]; for (int i = 0; i < dtResult.Columns.Count; i++) { if (i < 50) iaWidth[i] = 80; else iaWidth[i] = -1; } DevGridControlHelper.BindData(gdcSummary, dtResult, iaWidth); return false; } string sResId = gluResId.EditValue.ToString(); DateTime tFrom = DateCheck.Checked ? ((DateTime)dtFrom.EditValue) : DateTime.Now.AddDays(-1);//ToDo: 用一個之前的日期模擬實現查詢所有工單 DateTime tTo = DateCheck.Checked ? ((DateTime)dtTo.EditValue) : DateTime.Now;//保證查到今天建立的PO。加秒而不是加一天是為了避免AddDays()後查到第二天的資料 ToDo:第二個應該是AddDays(1)吧 DataTable dt = ListRoutineFDC.ViewFDCAlarmSummary(sResId: sResId, sStartTime: CommonFunction.ToStandardTime(tFrom, GlobalConstant.SYS_CONVERT_DATETIME_FORMAT), sEndTime: CommonFunction.ToStandardTime(tTo, GlobalConstant.SYS_CONVERT_DATETIME_FORMAT)); if (dt != null) { int[] iaWidth = new int[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { if (i < 50) iaWidth[i] = 80; else iaWidth[i] = -1;//共55列,後5列不顯示 } DevGridControlHelper.BindData(gdcSummary, dt, iaWidth); ChartControl stackedBarChart = new ChartControl(); Series[] aSeries = CreateSeries(dt, ViewType.SideBySideStackedBar);//將要顯示的資料繫結到series中 //((LineSeriesView)series.View).MarkerVisibility = DevExpress.Utils.DefaultBoolean.True; //((LineSeriesView)series.View).LineMarkerOptions.Size = 5; //chtSummary.Series.AddRange(aSeries); ((SideBySideStackedBarSeriesView)aSeries[0].View).StackedGroup = 0;////將兩個series分組在同一堆疊下。 ((SideBySideStackedBarSeriesView)aSeries[1].View).StackedGroup = 0; stackedBarChart.Dock = DockStyle.Fill; chtSummary.Series.AddRange(aSeries); // gdvDetail.Columns[0].Width = 20; return true; } else { DataTable dtResult = new DataTable(); dtResult.Columns.Add("PARA_DISPLAY_NAME"); dtResult.Columns.Add("FAULT_TIME"); dtResult.Columns.Add("DATA_CATEGORY"); dtResult.Columns.Add("SPEC_TYPE"); dtResult.Columns.Add("FAULT_TYPE"); dtResult.Columns.Add("FAULT_LEVEL"); dtResult.Columns.Add("DATA_STATUS"); dtResult.Columns.Add("PARA_VALUE"); dtResult.Columns.Add("TARGET"); dtResult.Columns.Add("USL"); dtResult.Columns.Add("UCL"); dtResult.Columns.Add("LCL"); dtResult.Columns.Add("LSL"); dtResult.Columns.Add("FAULT_DESC"); dtResult.Columns.Add("OPERATION_ID"); dtResult.Columns.Add("LOT_ID"); dtResult.Columns.Add("LOT_TYPE"); dtResult.Columns.Add("CASSETTE_SLOT"); dtResult.Columns.Add("SUBSTRATE_ID"); dtResult.Columns.Add("PRODUCT_ID"); dtResult.Columns.Add("RECIPE_ID"); dtResult.Columns.Add("STEP_ID"); dtResult.Columns.Add("MAIN_MODULE_ID"); dtResult.Columns.Add("CONTEXT_KEY"); dtResult.Columns.Add("INTERLOCK_FLAG"); dtResult.Columns.Add("COMPOSITE"); dtResult.Columns.Add("CMF_01"); dtResult.Columns.Add("CMF_02"); dtResult.Columns.Add("CMF_03"); dtResult.Columns.Add("CMF_04"); dtResult.Columns.Add("CMF_05"); dtResult.Columns.Add("CMF_06"); dtResult.Columns.Add("CMF_07"); dtResult.Columns.Add("CMF_08"); dtResult.Columns.Add("CMF_09"); dtResult.Columns.Add("CMF_10"); dtResult.Columns.Add("CMF_11"); dtResult.Columns.Add("CMF_12"); dtResult.Columns.Add("CMF_13"); dtResult.Columns.Add("CMF_14"); dtResult.Columns.Add("CMF_15"); dtResult.Columns.Add("CMF_16"); dtResult.Columns.Add("CMF_17"); dtResult.Columns.Add("CMF_18"); dtResult.Columns.Add("CMF_19"); dtResult.Columns.Add("CMF_20"); dtResult.Columns.Add("CREATE_USER_ID"); dtResult.Columns.Add("CREATE_TIME"); dtResult.Columns.Add("UPDATE_USER_ID"); dtResult.Columns.Add("UPDATE_TIME"); dtResult.Columns.Add("LEVEL_FAULT_COUNT"); dtResult.Columns.Add("LEVEL_WARNING_COUNT"); dtResult.Columns.Add("RAWID"); dtResult.Columns.Add("RES_ID"); dtResult.Columns.Add("DCP_ID"); int[] iaWidth = new int[dtResult.Columns.Count]; for (int i = 0; i < dtResult.Columns.Count; i++) { if (i < 50) iaWidth[i] = 80; else iaWidth[i] = -1; } DevGridControlHelper.BindData(gdcSummary, dtResult, iaWidth); return false; } }
將要顯示的資料繫結到series中,CreateSeries():
private Series[] CreateSeries(DataTable dt, ViewType viewType)
{
Series[] aSeries = new Series[2];
Series series1 = new Series("FAULT", viewType);//兩種不同的資料結果
Series series2 = new Series("WARNING", viewType);
int count = dt.Rows.Count;
try
{
int dNum_Fault = Convert.ToInt32(dt.Rows[0]["LEVEL_FAULT_COUNT"]);//統計結果值
int dNum_Warning = Convert.ToInt32(dt.Rows[0]["LEVEL_WARNING_COUNT"]);
string sResId = dt.Rows[0]["RES_ID"].ToString();//R15101 柱狀圖名稱
series1.Points.Add(new SeriesPoint(sResId, dNum_Fault));
series2.Points.Add(new SeriesPoint(sResId, dNum_Warning));
aSeries.SetValue(series1,0);
aSeries.SetValue(series2,1);
}
catch (Exception ex)
{
CommonFunction.ShowMsgBox(ex.Message);
series1.Points.Clear();
series2.Points.Clear();
return aSeries;
}
//series.ArgumentScaleType = ScaleType.DateTime;
// series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;//顯示標註標籤
return aSeries;
}
注:後臺能查到資料,但是前臺獲取不到或者獲取到其他列的資料,耐心地排查,可能是繫結時列表某個欄位漏