using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Drawing.Drawing2D; using System.Windows.Forms; using DevExpress.XtraCharts; namespace IStation.WinFrmUI.River { public partial class ViewRealTimeRiverWaterLevelCtrl : DevExpress.XtraEditors.XtraUserControl { public ViewRealTimeRiverWaterLevelCtrl() { InitializeComponent(); this.chartControl1.CustomPaint += new DevExpress.XtraCharts.CustomPaintEventHandler(this.ChartControl实时数据_CustomPaint); } private Model.eTideSouce _tideSouce = Model.eTideSouce.Book; public void SetTideSouce(Model.eTideSouce tideSouce) { _tideSouce = tideSouce; } private Series _areaSeries; private bool _isDispStrip = false; DateTime _rangDay1, _rangDay2, _rangDay3; DateTime _calcDay; private bool _isDay3 = false; /// /// 初始化默认系列 /// /// 数据源 //public void SetBindingData(List timeValues) //{ // _areaSeries = this.chartControl1.Series[0]; // if (timeValues == null || timeValues.Count() < 1) // { // // _defaultSeries.BindToData(timeValues, null); // } // else // { // timeValueBindingSource.DataSource = timeValues; // // _defaultSeries.BindToData(timeValues, "Time", "Level"); // } // //GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; // //GC.Collect(2, GCCollectionMode.Forced); // //GC.WaitForFullGCComplete(); //} public List SetBindingData3Day (DateTime calc_day, out string benchmark) { _isDay3 = true; benchmark = null; _calcDay = calc_day; string error1, error2, error3; List waterLevels长江1, waterLevels长江2, waterLevels长江3; if (calc_day == DateTime.Today) { _rangDay1 = calc_day.AddDays(-1); _rangDay2 = calc_day; _rangDay3 = calc_day.AddDays(1); } else if (calc_day == DateTime.Today.AddDays(1)) { _rangDay1 = calc_day.AddDays(-2); _rangDay2 = calc_day.AddDays(-1); _rangDay3 = calc_day; } else { _rangDay1 = calc_day.AddDays(-1); _rangDay2 = calc_day; _rangDay3 = calc_day.AddDays(1); } waterLevels长江1 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay1, out error1); waterLevels长江2 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay2, out error2); waterLevels长江3 = IStation.BLL.TideHelper.GetByDay (_tideSouce, _rangDay3, out error3); List timeValues = new List(); if (waterLevels长江1 != null) { timeValues.AddRange(waterLevels长江1); } else if(!string.IsNullOrEmpty(error1) && _rangDay1 <= DateTime.Today.AddDays(1)) { MessageBox.Show(error1); } if (waterLevels长江2 != null) { timeValues.AddRange(waterLevels长江2); } else if (!string.IsNullOrEmpty(error2) && _rangDay2 <= DateTime.Today.AddDays(1)) { MessageBox.Show(error1); } if (waterLevels长江3 != null) { timeValues.AddRange(waterLevels长江3); } else if (!string.IsNullOrEmpty(error3) && _rangDay3 <= DateTime.Today.AddDays(1)) { MessageBox.Show(error3); } _isDispStrip = true; _areaSeries = this.chartControl1.Series[0]; if (timeValues == null || timeValues.Count() < 1) { // _defaultSeries.BindToData(timeValues, null); } else { timeValueBindingSource.DataSource = timeValues; // _defaultSeries.BindToData(timeValues, "Time", "Level"); // this.chartControl1.AnnotationRepository[] DevExpress.XtraCharts.TextAnnotation textAnnotationMax = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation; DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMax = textAnnotationMax.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; DevExpress.XtraCharts.TextAnnotation textAnnotationMin = this.chartControl1.AnnotationRepository[1] as DevExpress.XtraCharts.TextAnnotation; DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMin = textAnnotationMin.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; var list22 = timeValues.Where(x => x.Time >= calc_day && x.Time <= calc_day.AddDays(1)); var maxLevel = list22.FindObjMaxBy(x => x.Level); paneAnchorPointMax.AxisXCoordinate.AxisValueSerializable = maxLevel.Time.ToString(); paneAnchorPointMax.AxisYCoordinate.AxisValueSerializable = maxLevel.Level.ToString(); textAnnotationMax.Text = string.Format("max:{0}", maxLevel.Level); var minLevel = list22.FindObjMinBy(x => x.Level); paneAnchorPointMin.AxisXCoordinate.AxisValueSerializable = minLevel.Time.ToString(); paneAnchorPointMin.AxisYCoordinate.AxisValueSerializable = minLevel.Level.ToString(); textAnnotationMin.Text = string.Format("min:{0}", minLevel.Level); } SetStripRange( ); return timeValues; } public List SetBindingData1Day(DateTime start, DateTime end, out string benchmark) { benchmark = null; string error; var waterLevels长江1 = IStation.BLL.TideHelper.GetByDay(_tideSouce, start, out error); List timeValues = new List(); if (waterLevels长江1 != null) { timeValues.AddRange(waterLevels长江1); } _areaSeries = this.chartControl1.Series[0]; if (timeValues == null || timeValues.Count() < 1) { // _defaultSeries.BindToData(timeValues, null); } else { timeValueBindingSource.DataSource = timeValues; // _defaultSeries.BindToData(timeValues, "Time", "Level"); // this.chartControl1.AnnotationRepository[] DevExpress.XtraCharts.TextAnnotation textAnnotationMax = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation; DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMax = textAnnotationMax.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; DevExpress.XtraCharts.TextAnnotation textAnnotationMin = this.chartControl1.AnnotationRepository[1] as DevExpress.XtraCharts.TextAnnotation; DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPointMin = textAnnotationMin.AnchorPoint as DevExpress.XtraCharts.PaneAnchorPoint; var maxLevel = timeValues.Where(x => x.Time >= start && x.Time <= end).FindObjMaxBy(x => x.Level); paneAnchorPointMax.AxisXCoordinate.AxisValueSerializable = maxLevel.Time.ToString(); paneAnchorPointMax.AxisYCoordinate.AxisValueSerializable = maxLevel.Level.ToString(); textAnnotationMax.Text = string.Format("max:{0}", maxLevel.Level); var minLevel = timeValues.Where(x => x.Time >= start && x.Time <= end).FindObjMinBy(x => x.Level); paneAnchorPointMin.AxisXCoordinate.AxisValueSerializable = minLevel.Time.ToString(); paneAnchorPointMin.AxisYCoordinate.AxisValueSerializable = minLevel.Level.ToString(); textAnnotationMin.Text = string.Format("min:{0}", minLevel.Level); } return timeValues; } private bool isInitialRange = false; private void SetStripRange( ) { var xyDiagram = this.chartControl1.Diagram as DevExpress.XtraCharts.XYDiagram; var strp1 = xyDiagram.AxisX.Strips[0]; //strp1.MinLimit.AxisValueSerializable = start.ToString();// "01/01/0001 00:00:00.000"; //strp1.MaxLimit.AxisValueSerializable = start.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; var strp2 = xyDiagram.AxisX.Strips[1]; //strp2.MinLimit.AxisValueSerializable = start.AddDays(1).ToString();// "01/01/0001 00:00:00.000"; //strp2.MaxLimit.AxisValueSerializable = start.AddDays(2).ToString();// "01/01/0001 01:00:00.000"; if (!isInitialRange) { isInitialRange = true; strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000"; strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).AddDays(2).ToString();// "01/01/0001 01:00:00.000"; strp2.MinLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 00:00:00.000"; } else { if (DateTime.Parse(strp1.MinLimit.AxisValueSerializable) > _rangDay1.AddDays(1)) { isInitialRange = true; strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000"; strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; } else { isInitialRange = true; strp1.MaxLimit.AxisValueSerializable = _rangDay1.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; strp1.MinLimit.AxisValueSerializable = _rangDay1.ToString();// "01/01/0001 00:00:00.000"; } if (DateTime.Parse(strp2.MinLimit.AxisValueSerializable) > _rangDay2.AddDays(1)) { isInitialRange = true; strp2.MinLimit.AxisValueSerializable = _rangDay2.ToString();// "01/01/0001 00:00:00.000"; strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; } else { isInitialRange = true; strp2.MaxLimit.AxisValueSerializable = _rangDay2.AddDays(1).ToString();// "01/01/0001 01:00:00.000"; strp2.MinLimit.AxisValueSerializable = _rangDay2.ToString();// "01/01/0001 00:00:00.000"; } } } private void ChartControl实时数据_CustomPaint(object sender, CustomPaintEventArgs e) { if (_isDay3 == false) return; if (_isDispStrip == false) return; Graphics g = e.Graphics; //g.SetClip(CalculateDiagramBounds()); g.SmoothingMode = SmoothingMode.AntiAlias; var mainDiagram = this.chartControl1.Diagram as DevExpress.XtraCharts.XYDiagram; double rang_max = Convert.ToDouble(mainDiagram.AxisY.WholeRange.MaxValue); using (Font fontDay普通 = new Font("黑体", 14, FontStyle.Regular)) using (Font fontDay加粗 = new Font("黑体", 16, FontStyle.Bold)) using (SolidBrush brushDay普通 = new SolidBrush(Color.PaleVioletRed)) using (SolidBrush brushDay加粗 = new SolidBrush(Color. DarkRed)) { StringFormat StrF = new StringFormat(); StrF.Alignment = StringAlignment.Center; StrF.LineAlignment = StringAlignment.Far; //StrF.FormatFlags = StringFormatFlags.DirectionVertical; var pt1 = mainDiagram.DiagramToPoint(_rangDay1.AddHours(12).ToString(), rang_max); var pt2 = mainDiagram.DiagramToPoint(_rangDay2.AddHours(12).ToString(), rang_max); var pt3 = mainDiagram.DiagramToPoint(_rangDay3.AddHours(12).ToString(), rang_max); var str1 = _rangDay1.ToString("MM月dd日"); if(_rangDay1==DateTime.Today) { str1 = string.Format("{0}(今日)", _rangDay1.ToString("MM月dd日")); } var str2 = _rangDay2.ToString("MM月dd日"); if (_rangDay2 == DateTime.Today) { str2 = string.Format("{0}(今日)", _rangDay2.ToString("MM月dd日")); } var str3 = _rangDay3.ToString("MM月dd日"); if (_rangDay3 == DateTime.Today) { str3 = string.Format("{0}(今日)", _rangDay3.ToString("MM月dd日")); } if (_rangDay1 == _calcDay) { g.DrawString(str1, fontDay加粗, brushDay加粗, new Point(pt1.Point.X - 5, pt1.Point.Y - 8), StrF); } else { g.DrawString(str1, fontDay普通, brushDay普通, new Point(pt1.Point.X - 5, pt1.Point.Y - 8), StrF); } if (_rangDay2 == _calcDay) { g.DrawString(str2, fontDay加粗, brushDay加粗, new Point(pt2.Point.X - 5, pt2.Point.Y - 8), StrF); } else { g.DrawString(str2, fontDay普通, brushDay普通, new Point(pt2.Point.X - 5, pt2.Point.Y - 8), StrF); } if (_rangDay3 == _calcDay) { g.DrawString(str3, fontDay加粗, brushDay加粗, new Point(pt3.Point.X - 5, pt3.Point.Y - 8), StrF); } else { g.DrawString(str3, fontDay普通, brushDay普通, new Point(pt3.Point.X - 5, pt3.Point.Y - 8), StrF); } } } } }