1. 程式人生 > >【DevExpress】將某列資料統計後按柱狀圖顯示

【DevExpress】將某列資料統計後按柱狀圖顯示

顯示結果預覽:

如上圖:將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;
        }

DevExpress官網柱狀圖示例

 

注:後臺能查到資料,但是前臺獲取不到或者獲取到其他列的資料,耐心地排查,可能是繫結時列表某個欄位漏