您的位置:首页 > 编程语言 > C#

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

2010-08-23 09:58 477 查看
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();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: