C# winform chart 曲线加多线程控制

来源:互联网 发布:linux 查看已安装字体 编辑:程序博客网 时间:2024/04/28 21:08
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using WeifenLuo.WinFormsUI.Docking;
using ty.Model;
using ty.BLL;
using DevExpress.XtraLayout;


using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;


using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Card;


using System.Xml;
using Dundas.Charting.WinControl;
using System.Threading;


namespace TransmissionLine
{
    //定义一个委托
    public delegate void DataChange1();


    public struct DecimalRange1
    {
        public DecimalRange1(decimal maxValue, decimal minValue)
        {
            this.MaxValue1 = Math.Max(maxValue, minValue);
            this.MinValue1 = Math.Min(maxValue, minValue);
        }




        public decimal MaxValue1;
        public decimal MinValue1;
    }




    /// <summary>
    /// 4个表共同的委托历史数据方法
    /// </summary>
    public delegate void SelectHistoryData();//定义委托


    public partial class SMidHistoricalDataCT : dpDummyDoc
    {
        DataTable dt;  //定一个DataTable对象


        //int a = 0;


        //定义一个父窗体对象
        dpMain dpmain;


        int id = 1;  //xml 文档的编号
        /// <summary>
        /// 线路历史数据表
        /// </summary>
        public static bool result1 = false;


        /// <summary>
        /// 下拉框移出节点的判断
        /// </summary>
        public static bool removeCB1 = false;


        int a = 0;
        /// <summary>
        /// 4个表共同的委托历史数据方法,当是执行事件不同
        /// </summary>
        public event SelectHistoryData selecthistorydatas; //定义委托事件


        //定义静态变量
        private DateTime strCOLLECTTIME;//采集时间
        private string strLINENAME;    //线路名


        DateTime startDate = DateTime.Now;//获得系统当前时间
        //string xmlnameCount = "";//xml name


        /// <summary>
        /// 构造函数
        /// </summary>
        public SMidHistoricalDataCT(dpMain dpmain)
        {
            this.dpmain = dpmain;


            //dt = new DataTable();  //   在构造函数里实例化 


            InitializeComponent();
        }




        public void SMidHistoricalDataCT_Load(object sender, EventArgs e)
        {//页面加载
            PublicClass.PassMethod.setskip = 1;


            if (SelObjChoice.pageHeadtext != "" && PublicClass.PassMethod.historyTree == 1)
            {
                this.TabText = SelObjChoice.pageHeadtext;//页面头部显示
                //this.chart1.Titles[0].Text = SelObjChoice.pageHeadtext + "曲线图";//标题设置
            }
            else
            {
                this.TabText = LeftHistoricaldata.LeftpageHeadtext;
                //this.chart1.Titles[0].Text = LeftHistoricaldata.LeftpageHeadtext + "曲线图";//标题设置
            }
           // PublicClass.cbXmlClass.InsertXml(this.Text);//插入xml文档


            gridView1.GroupPanelText = "拖动列到此处进行分类";  //头部显示文字
            gridView1.OptionsBehavior.Editable = false;         //只读不拷贝


            //BindGridView(this, EventArgs.Empty);//绑定查询方法


            //result1 = true;//页面加载返回真


            


            //注册事件
            this.gridControl1.EmbeddedNavigator.ButtonClick += new NavigatorButtonClickEventHandler(EmbeddedNavigator_ButtonClick);
        }


        void EmbeddedNavigator_ButtonClick(object sender, NavigatorButtonClickEventArgs e)
        {
            if (Login.Userrole == "普通用户")
            {
                MessageBox.Show("你没有权限,请联系管理员");
            }
            else
            {
                switch (e.Button.ButtonType)
                {
                    case NavigatorButtonType.Custom:
                        if (e.Button.Hint == "删除")
                        {
                            //声明一个返回值
                            DialogResult ReturnDlg = MessageBox.Show(this, "是否要删除该记录?", "信息提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                            if (ReturnDlg == DialogResult.Yes)
                            {//等于是的时候
                                try
                                {
                                    CAPACITY_HISTORY model = new CAPACITY_HISTORY();
                                    model.COLLECTTIME = strCOLLECTTIME;//设备名
                                    model.LINENAME = strLINENAME;
                                    int message = new CAPACITY_HISTORYBLL().Del(model);
                                    if (message == 0)
                                        MessageBox.Show("删除失败!");
                                    else
                                    {
                                        MessageBox.Show("删除成功!");
                                        dpmain.BindGridViewCAPACITY_HISTORY();//重新刷新数据
                                    }
                                }
                                catch
                                {
                                    MessageBox.Show("该记录不能被删除");
                                }


                            }
                        }


                        break;
                }
            }


        }


        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            try
            {//没有行的时候产生异常不处理
                int selectedHandle = this.gridView1.GetSelectedRows()[0];
                strCOLLECTTIME =Convert.ToDateTime(this.gridView1.GetRowCellValue(selectedHandle, "COLLECTTIME").ToString());//获得选中的行
                strLINENAME = this.gridView1.GetRowCellValue(selectedHandle, "LINENAME").ToString();
            }
            catch
            { }
        }






        private void SMidHistoricalDataCT_FormClosed(object sender, FormClosedEventArgs e)
        {//页面关闭后发生
            result1 = false;
            removeCB1 = true;//关闭一个页面返回为真
            //dpMain.lists1.Remove();


            for (int i = 0; i < PublicClass.PassMethod.lists.Count; i++)
            {
                if (this.TabText == PublicClass.PassMethod.lists[i].TabText)
                {
                    PublicClass.PassMethod.lists.RemoveAt(i);//移除combox值
                    break;
                }
            }
            dpmain.refreshList();//刷新列表
            
     
        }


        private void SMidHistoricalDataCT_Activated(object sender, EventArgs e)
        {//每当页面激活时
            dpmain.SMidhdct = this;//打开页面还是当前页
            PublicClass.PassMethod.historyChoice = "线路容量历史数据";


            PublicClass.PassMethod.setskip = 1;


            dpmain.showRightPage(this.TabText);//右边页面显示
        }


        /// <summary>
        /// 多线程执行的方法
        /// </summary>
        public void BindingSourceListChanged()
        {
            Control.CheckForIllegalCrossThreadCalls = false;//控件产生的异常不做处理
            this.chart1.SuspendLayout();
            this.updateChartSeriesBackgroundWorker.RunWorkerAsync(this.toolStripProgressBar1);
            timer1.Start();//心跳开启


            //if (this.updateChartSeriesBackgroundWorker.IsBusy)
            //{
            //    this.updateChartSeriesBackgroundWorker.CancelAsync();
            //}
            //else
            //{
                //this.chart1.SuspendLayout();
                //this.updateChartSeriesBackgroundWorker.RunWorkerAsync();
            //}


        }


        private void updateChartSeriesBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {//调用委托
            //this.Invoke(new DataChange1(DataSourceChange));
            this.toolStripStatusLabel1.Text = "Loading ... " + "Thanks for your patience";
            string strsql = null;
            dt = null;
            if (SelObjChoice.treevalueline != "")
            {
                strsql = " where LINENAME = '" + SelObjChoice.treevalueline + "' and TO_CHAR(COLLECTTIME,'YYYY-MM-DD HH24:MI:SS') between '" + RightChoice.historystartTime + "' and  '" + RightChoice.historyendTime + "' ORDER BY COLLECTTIME ASC";
            }
            else
            {
                strsql = " where LINENAME = '" + LeftHistoricaldata.Parenttreevalueline + "' and TO_CHAR(COLLECTTIME,'YYYY-MM-DD HH24:MI:SS') between '" + RightChoice.historystartTime + "' and  '" + RightChoice.historyendTime + "' ORDER BY COLLECTTIME ASC";
            }
            try
            {
                dt = new CAPACITY_HISTORYBLL().SelectCAPACITY_HISTORY(strsql);
            }
            catch
            {
                MessageBox.Show("操作有误!请缩短查询范围");
            }


            e.Result = dt;
            toolStripStatusLabel1.Text = "Please, wait ...";
        }


        /// <summary>
        /// 线路历史记录查询
        /// </summary>
        public void DataSourceChange()
        {
            string LegendText;
            Color color;
            DecimalRange1 rang;
            //string strsql = null;


            //线路负荷
            string maxpricefh = "";//最大值
            string minpricefh = "";//最小值
            //string colorNamefh = "";//颜色名


            //线路平均温度
            string maxpriceat = "";//最大值
            string minpriceat = "";//最小值
            //string colorNameat = "";//颜色名


            //线路计算容量
            string maxpricerl = "";//最大值
            string minpricerl = "";//最小值
            //string colorNamerl = "";//颜色名 


            this.chart1.Legends["Default"].CustomItems.Clear();
            this.chart1.Series.Clear();


            this.chart1.ChartAreas["Default"].AxisX.View.ZoomReset(100);


            //if (SelObjChoice.treevalueline != "")
            //{
            //    strsql = " where LINENAME = '" + SelObjChoice.treevalueline + "' and TO_CHAR(COLLECTTIME,'YYYY-MM-DD HH24:MI:SS') between '" + RightChoice.historystartTime + "' and  '" + RightChoice.historyendTime + "' ORDER BY COLLECTTIME ASC";
            //}
            //else
            //{
            //    strsql = " where LINENAME = '" + LeftHistoricaldata.Parenttreevalueline + "' and TO_CHAR(COLLECTTIME,'YYYY-MM-DD HH24:MI:SS') between '" + RightChoice.historystartTime + "' and  '" + RightChoice.historyendTime + "' ORDER BY COLLECTTIME ASC";
            //}
            ////DataTable dt = new CAPACITY_HISTORYBLL().SelectCAPACITY_HISTORY(strsql);
            //dt = new CAPACITY_HISTORYBLL().SelectCAPACITY_HISTORY(strsql);


            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Application.StartupPath + "//historyDataFixedValue.xml");
            XmlNode root = xmlDoc.SelectSingleNode("fathernode");
            XmlNode root1 = root.SelectSingleNode("线路容量历史数据");
            XmlNodeList nodelist = root1.ChildNodes;
            foreach (XmlNode xn in nodelist)
            {
                XmlElement xe = (XmlElement)(xn);//节点强制转化
                XmlNodeList nodelist1 = xe.ChildNodes;//继续向下节点查
                switch (xe.GetAttribute("name"))
                {
                    case "线路负荷":
                        foreach (XmlNode xn1 in nodelist1)
                        {
                            XmlElement xe1 = (XmlElement)(xn1);
                            switch (xe1.Name)
                            {
                                case "maxvalue":
                                    maxpricefh = xe1.InnerText;//节点赋值
                                    break;
                                case "minvalue":
                                    minpricefh = xe1.InnerText;
                                    break;
                                //case "color":
                                //    colorNamefh = xe1.InnerText;
                                //    break;
                            }
                        }
                        break;
                    case "线路平均温度":
                        foreach (XmlNode xn1 in nodelist1)
                        {
                            XmlElement xe1 = (XmlElement)(xn1);
                            switch (xe1.Name)
                            {
                                case "maxvalue":
                                    maxpriceat = xe1.InnerText;//节点赋值
                                    break;
                                case "minvalue":
                                    minpriceat = xe1.InnerText;
                                    break;
                                //case "color":
                                //    colorNameat = xe1.InnerText;
                                //    break;
                            }
                        }
                        break;
                    case "线路计算容量":
                        foreach (XmlNode xn1 in nodelist1)
                        {
                            XmlElement xe1 = (XmlElement)(xn1);
                            switch (xe1.Name)
                            {
                                case "maxvalue":
                                    maxpricerl = xe1.InnerText;//节点赋值
                                    break;
                                case "minvalue":
                                    minpricerl = xe1.InnerText;
                                    break;
                                //case "color":
                                //    colorNamerl = xe1.InnerText;
                                //    break;
                            }
                        }
                        break;
                }
            }
            if (RightChoice.slineload==true)
            {
                rang = new DecimalRange1(Convert.ToDecimal(maxpricefh), Convert.ToDecimal(minpricefh));
                color = Color.Yellow;
                LegendText = "线路负荷(A)/n范围:" + rang.MinValue1 + "到" + rang.MaxValue1;
                AddSeries(LegendText, color, 2, dt.Rows, rang);//中间数字2代表数据库的列第3列下标从零开始
            }
            if (RightChoice.sLINETEMPERATURE==true)
            {
                DecimalRange1 rang2 = new DecimalRange1(Convert.ToDecimal(maxpriceat), Convert.ToDecimal(minpriceat));
                color = Color.Red;
                LegendText = "线路平均温度(摄氏度)/n范围:" + rang2.MinValue1 + "到" + rang2.MaxValue1;
                AddSeries(LegendText, color, 3, dt.Rows, rang2);
            }


            if (RightChoice.sLINECAPACITY == true)
            {
                DecimalRange1 rang3 = new DecimalRange1(Convert.ToDecimal(maxpricerl), Convert.ToDecimal(minpricerl));
                color = Color.Green;
                LegendText = "线路计算容量(A)/n范围:" + rang3.MinValue1 + "到" + rang3.MaxValue1;
                AddSeries(LegendText, color, 4, dt.Rows, rang3);
            }
        }


        private void AddSeries(string LegendText, Color color, int col, DataRowCollection Rows, DecimalRange1 rang)
        {
            Series series = new Series();
            series.Type = SeriesChartType.FastLine;
            series.ShowInLegend = true;
            series.LegendText = series.ToolTip = LegendText;
            series.Color = color;
            series.XValueType = ChartValueTypes.DateTime;
            for (int i = 0; i < Rows.Count; i++)
            {
                DataPoint pt = new DataPoint();


                double currentValue = Convert.ToDouble(Rows[i][col]);


                if (currentValue < Convert.ToDouble(rang.MinValue1))
                    currentValue = Convert.ToDouble(rang.MinValue1);
                if (currentValue > Convert.ToDouble(rang.MaxValue1))
                    currentValue = Convert.ToDouble(rang.MaxValue1);


                DateTime tim = (DateTime)Rows[i][0];


                pt.SetValueXY(tim, (currentValue - Convert.ToDouble(rang.MinValue1)) / Convert.ToDouble(rang.MaxValue1 - rang.MinValue1) * 100);
                pt.ToolTip = "日期:" + tim.ToLongDateString() + "/n时间:" +
                           tim.ToLongTimeString() + "/n" +
                           series.LegendText + "/n值" + currentValue.ToString();
                series.Points.Add(pt);
            }


            this.chart1.Series.Add(series);
        }


        private void 放大ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            double min = this.chart1.ChartAreas[0].AxisX.View.GetViewMinimum();
            double max = this.chart1.ChartAreas[0].AxisX.View.GetViewMaximum();
            this.chart1.ChartAreas[0].AxisX.View.Zoom(min, (max + min) / 2);
            a++;
        }


        private void 缩小ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.chart1.ChartAreas[0].AxisX.View.ZoomReset(1);
            if (a > 0)
                a--;
        }


        private void 还原ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.chart1.ChartAreas[0].AxisX.View.ZoomReset(100);
        }


        private void updateChartSeriesBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //if (e.Cancelled)
            //{
            //    this.updateChartSeriesBackgroundWorker.RunWorkerAsync();
            //}
            //else if (e.Error != null)
            //{
            //    MessageBox.Show(e.Error.Message);
            //}
            //else
            //{
            //    this.chart1.ResumeLayout(true);
            //    this.chart1.Invalidate(true);
            //    this.chart1.Titles["State"].Text = "更新完毕/n" + DateTime.Now.ToLongTimeString();
            //}


            toolStripProgressBar1.Value = 100;
            //dataGridView1.DataSource = e.Result;
            DataSourceChange();
            toolStripStatusLabel1.Text = "";
            toolStripProgressBar1.Value = 0;
            timer1.Stop();
            toolStripStatusLabel2.Text = "";


            this.chart1.ResumeLayout(true);
            this.chart1.Invalidate(true);
            this.chart1.Titles["State"].Text = "更新完毕/n" + DateTime.Now.ToLongTimeString();


            RightChoice.isQuering = false;
            MessageBox.Show("查询结束!!!!", "友情提示");
            //this.statusStrip1.Visible = false;
        }


        private void 设置ToolStripMenuItem_Click(object sender, EventArgs e)
        {//设置参数
            SetFixedValue sfv = new SetFixedValue();
            sfv.ShowDialog();
        }


        private void timer1_Tick(object sender, EventArgs e)
        {//计算时间设置  启动时间格式00:00:000
            TimeSpan ts = DateTime.Now.Subtract(startDate);
            string sTime = " ..." + ts.Minutes.ToString("00") +
               ":" + ts.Seconds.ToString("00") +
               ":" + ts.Milliseconds.ToString("000");
            toolStripStatusLabel2.Text = sTime;
            if (toolStripProgressBar1.Value == toolStripProgressBar1.Maximum)
            {
                toolStripProgressBar1.Value = 0;
            }
            toolStripProgressBar1.PerformStep(); 
        }


    }
}
原创粉丝点击