WinFrom .NET TeeChart滾動縮放功能 按鈕縮放功能開發

<1>中的不能動態縮放,將添加動態縮放功能

首先添加兩個DateTimePicker控件顯示Bottom的範圍

開始的思想是,通過這個兩個控件來控制TeeChart的繪圖範圍

private void tChart1_MouseWheel(object sender, MouseEventArgs e)
{
	if (tChart1 != null)
	{
		
		if (e.Delta > 0)
		{
			if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
			{
				dateTimePicker3.Value = dateTimePicker3.Value.AddHours(4);
			}
			dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-4);

			dateTimePicker4.Value = dateTimePicker4.Value.AddHours(4);
			this.button24_Click(sender, e);
		}
		else
		{
			if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
			{
				dateTimePicker3.Value = dateTimePicker3.Value.AddHours(3);

				dateTimePicker4.Value = dateTimePicker4.Value.AddHours(3);
			}
			dateTimePicker3.Value = dateTimePicker3.Value.AddHours(4);

			dateTimePicker4.Value = dateTimePicker4.Value.AddHours(-4);
			this.button24_Click(sender, e);
			
		}
	}
}
private void zoombtnClick(object sender, EventArgs e)
{
	if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
	{
		dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-4);
	}
	dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-6);

	dateTimePicker4.Value = dateTimePicker4.Value.AddHours(6);
	this.button24_Click(sender, e);
}

private void undobtnClick(object sender, EventArgs e)
{
	if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
	{
		dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-4);

		dateTimePicker4.Value = dateTimePicker4.Value.AddHours(4);
	}
	dateTimePicker3.Value = dateTimePicker3.Value.AddHours(6);

	dateTimePicker4.Value = dateTimePicker4.Value.AddHours(-6);
	this.button24_Click(sender, e);
}

this.button24_Click(sender, e);這個調用drawchart(bigdate, enddate);//繪圖

private void button24_Click(object sender, EventArgs e)
{
	//檢測是否在繪製中
   // Console.Out.WriteLine(tChart1.Printing);
	if (tChart1.Printing)
	{
		return;
	}
	//繪圖參數設置,準備繪圖
	HideChartControl();
	//獲取時間
	string bigdate;
	string enddate;
	bigdate = dateTimePicker3.Value.ToString("yyyy-MM-dd HH:mm:ss").Substring(0, 19);
	enddate = dateTimePicker4.Value.ToString("yyyy-MM-dd HH:mm:ss").Substring(0, 19);
	if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
	{
		enddate = dateTimePicker3.Value.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss").Substring(0, 19);
	}

	CommOp.clearTools();//刪除出了遊標以外的所有註釋工具
	CommOp.ClearChart();//清空圖表
	drawchart(bigdate, enddate);//繪圖
	ShowChartControl();
}
private void drawchart(string sdate, string edate)
{
	DBCM dbcm = new DBCM();//服務器類
	String[] mps;
	//生成每一條曲線
	String wherestring = " and  measuredt >= '" + sdate + "'and measuredt<= '" + edate + "' order by measuredt asc";
	DataSet ds = new DataSet();
	//先畫出所有的縱軸
	String f = " 1=1 ";
	ds = dbcm.queryds("select * from tb_mp_" + mps[0] + " where " + f + wherestring);
	CommOp.drawline(ds, ((SeriesObject)mpchartlist[i]));

	tChart1.Refresh();
	
	CommOp.adjustXvalues(sdate, edate);
	
	setChartDate(sdate, edate);//之前有誤差,把日期傳入後精確
	tChart1.Legend.CheckBoxes = true;//通過選擇框來選擇是否顯示曲線
}
public static void drawline(Object ds, SeriesObject so)
{
	if (ds != null)
	{
		DataTable dt = null;
		int indextodraw = 0;
		if (tchart.Series.Count > 0)
		{
			indextodraw = tchart.Series.Count;
		}
		if (ds.GetType().Name == "DataSet")
		{
			dt = ((DataSet)ds).Tables[0];
		}
		if (ds.GetType().Name == "DataTable")
		{
			dt = (DataTable)ds;
		}
		tchart.Series.Add(new Steema.TeeChart.Styles.FastLine());//畫線

		tchart.Series[indextodraw].DataSource = dt;
		if (dt.Columns["parmvalue"] != null && dt.Columns["measuredt"] != null)
		{
			tchart.Series[indextodraw].YValues.DataMember = dt.Columns["parmvalue"].ToString();
			tchart.Series[indextodraw].XValues.DataMember = dt.Columns["measuredt"].ToString();
			tchart.Series[indextodraw].LabelMember = so.spanrange.ToString()+","+so.numtail.ToString();
		}

		tchart.Series[indextodraw].XValues.DateTime = true;
		tchart.Series[indextodraw].Visible = so.visiable;
		tchart.Series[indextodraw].Title = so.disname;
		tchart.Series[indextodraw].CustomVertAxis = so.cva;
		tchart.Refresh();
	}
}

這樣做雖然可以實現動態繪圖但是會出現BUG而且放大和縮小的時間不好控制,有可能出現開始時間大於結束時間

所以換一種方法將繪好BOTTON中的值取出,重新進行放大縮小,然後根據放大縮小的值來查詢服務器數據進行繪製

private void tChart1_MouseWheel(object sender, MouseEventArgs e)
{	 
	if (tChart1 != null)
	{
	double XMid = ((CursorTool)tChart1.Tools[0]).XValue; 
	if (e.Delta > 0)
	{

		double OldXMin = tChart1.Axes.Bottom.Minimum;
		double OldXMax = tChart1.Axes.Bottom.Maximum;
		double NewXMin = (XMid * 0.5 + OldXMin) / (1.5);
		double NewXMax = (XMid * 0.5 + OldXMax) / (1.5);
		dateTimePicker3.Value = DateTime.FromOADate(NewXMin);
		dateTimePicker4.Value = DateTime.FromOADate(NewXMax);
		this.button24_Click(sender, e);
	}
	else
	{
		double OldXMin = tChart1.Axes.Bottom.Minimum;
		double OldXMax = tChart1.Axes.Bottom.Maximum;
		double NewXMin = (-XMid * 0.5 + OldXMin) / (0.5);
		double NewXMax = (-XMid * 0.5 + OldXMax) / (0.5);
		dateTimePicker3.Value = DateTime.FromOADate(NewXMin);
		dateTimePicker4.Value = DateTime.FromOADate(NewXMax);
		this.button24_Click(sender, e);
	}
}


private void zoombtnClick(object sender, EventArgs e)
{
	if (DateTime.Compare(dateTimePicker3.Value, dateTimePicker4.Value) >= 0)
	{
		dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-4);
	}
	dateTimePicker3.Value = dateTimePicker3.Value.AddHours(-6);

	dateTimePicker4.Value = dateTimePicker4.Value.AddHours(6);
	this.button24_Click(sender, e);
}
這樣顯示框的時間可能會超出繪製出的時間,將顯示框的時間調整一下

dateTimePicker4.Value = DateTime.FromOADate(tChart1.Axes.Bottom.Maximum);

這樣基本功能是可以完成了,但是這樣繪製圖形每次都需要連接服務器獲取時間,一個初步的想法是一次取出一定量的數據放到緩存中,每次繪製檢查時間,如果超出再連接服務器獲取一定量的數據,後續再進行改進

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章