chart的一个问题,因为我用了timer所以,每次写曲线的时候会出现重复数据的问题,在线等。。。
第一次执行可以的,但是第二次的时候,因为比如这个Chart1.Series.Add(series1);已经有了,所以会提示,“series1”的字符串已经有了,所以出现错误,我应该怎么解决呢,小弟先谢过了哈!
public partial class TypeRealTimeChart : System.Web.UI.Page
{
private string typeid = "1";
private static valuetime wendu1;
private static valuetime wendu2;
private static valuetime wendu3;
private static valuetime wendu4;
string camroom1;
string camroom2;
string camroom3;
string camroom4;
int i = 0;
struct valuetime
{
public double value;
public DateTime time;
}
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["pid"] != null)
{
typeid = Request.QueryString["pid"];
//modify chart title by sensorid
switch (typeid)
{
case "1":
Chart1.Titles[0].Text = "温度曲线";
break;
case "2":
Chart1.Titles[0].Text = "湿度曲线";
break;
case "3":
Chart1.Titles[0].Text = "电压曲线";
break;
case "4":
Chart1.Titles[0].Text = "电流曲线";
break;
}
}
}
/// <summary>
/// Handles the Tick event of the Timer1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Timer1_Tick(object sender, EventArgs e)
{
UpdateChart();
}
private void UpdateChart()
{
string dsn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(dsn);
con.Open();
// SqlCommand cmd = new SqlCommand("select * from article where articletype=3", con);
SqlDataAdapter da = new SqlDataAdapter("select top 1 campus+room as camroom1 from measurement_v group by campus,room", con);
//SqlDataAdapter da1 = new SqlDataAdapter("select top 1 campus+room as camroom from measurement_v where campus+room !=(select top 1 campus+room from measurement_v group by campus,room)group by campus,room", con);
//SqlDataAdapter da2 = new SqlDataAdapter("select top 1 campus+room as camroom from measurement_v group by campus,room", con);
//SqlDataAdapter da3 = new SqlDataAdapter("select top 1 campus+room as camroom from measurement_v group by campus,room", con);
DataTable dt = new DataTable();
da.Fill(dt);
camroom1 = dt.Rows[0]["camroom1"].ToString();//dt.Rows[0]["content"].ToString();
SqlDataAdapter da1 = new SqlDataAdapter("select top 1 campus+room as camroom2 from measurement_v where campus+room != '" + camroom1 + "' group by campus,room", con);
DataTable dt1 = new DataTable();
da1.Fill(dt1);
camroom2 = dt1.Rows[0]["camroom2"].ToString();//dt.Rows[0]["content"].ToString();
SqlDataAdapter da2 = new SqlDataAdapter("select top 1 campus+room as camroom3 from measurement_v where campus+room != '" + camroom1 + "' and campus+room != '" + camroom2 + "' group by campus,room", con);
DataTable dt2 = new DataTable();
da2.Fill(dt2);
camroom3 = dt2.Rows[0]["camroom3"].ToString();//dt.Rows[0]["content"].ToString();
SqlDataAdapter da3 = new SqlDataAdapter("select top 1 campus+room as camroom4 from measurement_v where campus+room != '" + camroom1 + "' and campus+room != '" + camroom2 + "'and campus+room != '" + camroom3 + "' group by campus,room", con);
DataTable dt3 = new DataTable();
da3.Fill(dt3);
camroom4 = dt3.Rows[0]["camroom4"].ToString();//dt.Rows[0]["content"].ToString();
//数据集显示属性设置
//数据集"出口"显示属性设置
Series series1 = new Series(camroom1); //数据集声明
series1.ChartType = SeriesChartType.Spline; //数据显示方式 Line:为折线 Spline:曲线
// series1.Color = Color.Green; //线条颜色
series1.XValueType = ChartValueType.String;
series1.IsXValueIndexed = true;
series1.IsValueShownAsLabel = false;
series1.YValueType = ChartValueType.Double;
series1.MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型
series1.ShadowOffset = 1;
bool bSuc = GetValue(typeid, "1", ref wendu1);
if (bSuc)
{
string lastXValue = wendu1.time.ToLongTimeString();
double lastYValue = wendu1.value;
series1.Points.AddXY(lastXValue, lastYValue);
series1.ToolTip = "X value = #VALX\nY value = #VALY";
//series.IsValueShownAsLabel = true;
}
Chart1.Series.Add(series1);
//数据集"出口"显示属性设置
Series series2 = new Series(camroom2); //数据集声明
series2.ChartType = SeriesChartType.Spline; //数据显示方式 Line:为折线 Spline:曲线
// series2.Color = Color.Red; //线条颜色
series2.XValueType = ChartValueType.String;
series2.IsXValueIndexed = true;
series2.IsValueShownAsLabel = false;
series2.YValueType = ChartValueType.Double;
series2.MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型
series2.ShadowOffset = 1;
bSuc = GetValue(typeid, "2", ref wendu1);
if (bSuc)
{
string lastXValue = wendu1.time.ToLongTimeString();
double lastYValue = wendu1.value;
series2.Points.AddXY(lastXValue, lastYValue);
series2.ToolTip = "X value = #VALX\nY value = #VALY";
//series.IsValueShownAsLabel = true;
}
Chart1.Series.Add(series2);
//数据集"出口"显示属性设置
Series series3 = new Series(camroom3); //数据集声明
series3.ChartType = SeriesChartType.Spline; //数据显示方式 Line:为折线 Spline:曲线
// series3.Color = Color.Red; //线条颜色
series3.XValueType = ChartValueType.String;
series3.IsXValueIndexed = true;
series3.IsValueShownAsLabel = false;
series3.YValueType = ChartValueType.Double;
series3.MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型
series3.ShadowOffset = 1;
bSuc = GetValue(typeid, "3", ref wendu1);
if (bSuc)
{
string lastXValue = wendu1.time.ToLongTimeString();
double lastYValue = wendu1.value;
series3.Points.AddXY(lastXValue, lastYValue);
series3.ToolTip = "X value = #VALX\nY value = #VALY";
//series.IsValueShownAsLabel = true;
}
Chart1.Series.Add(series3);
//数据集"出口"显示属性设置
Series series4 = new Series(camroom4); //数据集声明
series4.ChartType = SeriesChartType.Spline; //数据显示方式 Line:为折线 Spline:曲线
// series4.Color = Color.Red; //线条颜色
series4.XValueType = ChartValueType.String;
series4.IsXValueIndexed = true;
series4.IsValueShownAsLabel = false;
series4.YValueType = ChartValueType.Double;
series4.MarkerStyle = MarkerStyle.Circle; //线条上的数据点标志类型
series4.ShadowOffset = 1;
bSuc = GetValue(typeid, "4", ref wendu1);
if (bSuc)
{
string lastXValue = wendu1.time.ToLongTimeString();
double lastYValue = wendu1.value;
series4.Points.AddXY(lastXValue, lastYValue);
series4.ToolTip = "X value = #VALX\nY value = #VALY";
//series.IsValueShownAsLabel = true;
}
Chart1.Series.Add(series4);
while (series1.Points.Count > 100)
{
// Remove series points
foreach (Series series in this.Chart1.Series)
{
series.Points.RemoveAt(0);
}
}
// Adjust categorical scale
double axisMinimum = series1.Points[0].XValue;
this.Chart1.ChartAreas[0].AxisX.Minimum = axisMinimum;
this.Chart1.ChartAreas[0].AxisX.Maximum = axisMinimum + 100;
con.Close();
}
/// <summary>
/// 取值
/// </summary>
/// <param name="type">数值类型:1温度;2湿度;3电压;4电流</param>
/// <param name="sensorid">传感器标记:各个机房对应不同传感器标记</param>
/// <returns>返回值</returns>
private bool GetValue(string type, string sensorid, ref valuetime newValue)
{
string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string sql =
"SELECT TOP 1 [value],stime FROM measurements WHERE (type = @type) AND (sensorid = @sensorid) ORDER BY stime DESC";
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@type", SqlDbType.VarChar);
cmd.Parameters["@type"].Value = type;
cmd.Parameters.Add("@sensorid", SqlDbType.VarChar);
cmd.Parameters["@sensorid"].Value = sensorid;
try
{
conn.Open();
SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (sdr.Read())
{
newValue.value = (double)sdr["value"];
newValue.time = (DateTime)sdr["stime"];
}
else
{
return false;
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
return true;
}
}