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