Windows Forms中C# SQL查询覆盖Chart各Series数据的原因
解决Chart控件Series数据被覆盖的问题
问题出在你给整个Chart控件设置了DataSource并调用DataBind()——这会让Chart下所有Series共享同一个数据源。当你执行第二个方法时,新的数据源会覆盖Chart的全局数据源,导致所有Series都使用最后一次查询的结果。
要解决这个问题,不需要给整个Chart设置数据源,而是单独为每个Series指定数据源并绑定,修改后的代码如下:
修改getDataA方法:
public static void getDataA(Chart chart, string wc) { string commandSql = "SELECT TOP 8 Example1, Example2, Example3, Example4 FROM ***** WHERE Example5 = @wc AND Example6 = 'A' ORDER BY Example7 Desc"; // 使用using自动释放连接资源 using (SqlConnection conn = new SqlConnection("Data Source = ****; Initial Catalog = ****; Integrated Security = True")) { SqlDataAdapter da = new SqlDataAdapter(); SqlCommand cmd = new SqlCommand(commandSql, conn); cmd.Parameters.AddWithValue("wc", wc); da.SelectCommand = cmd; DataSet ds = new DataSet(); conn.Open(); da.Fill(ds); // 仅为当前Series设置数据源,而非整个Chart chart.Series[0].DataSource = ds.Tables[0]; chart.Series[0].XValueMember = "Production_Hour"; chart.Series[0].YValueMembers = "Cuts"; // 只绑定当前Series chart.Series[0].DataBind(); } }
修改getDataB方法:
同理,将chart.Series[1]的数据源设置为查询B的数据集,并单独调用该Series的DataBind():
public static void getDataB(Chart chart, string wc) { string commandSql = "SELECT TOP 8 Example1, Example2, Example3, Example4 FROM ***** WHERE Example5 = @wc AND Example6 = 'B' ORDER BY Example7 Desc"; using (SqlConnection conn = new SqlConnection("Data Source = ****; Initial Catalog = ****; Integrated Security = True")) { SqlDataAdapter da = new SqlDataAdapter(); SqlCommand cmd = new SqlCommand(commandSql, conn); cmd.Parameters.AddWithValue("wc", wc); da.SelectCommand = cmd; DataSet ds = new DataSet(); conn.Open(); da.Fill(ds); chart.Series[1].DataSource = ds.Tables[0]; chart.Series[1].XValueMember = "Production_Hour"; chart.Series[1].YValueMembers = "Cuts"; chart.Series[1].DataBind(); } }
关键说明:
- 移除
chart.DataSource = ds.Tables[0];和chart.DataBind();,避免全局覆盖所有Series的数据源 - 为每个Series单独指定
DataSource并调用DataBind(),确保每个Series只使用自己的查询结果 - 用
using包裹SqlConnection,自动释放数据库连接资源(可选但推荐,避免资源泄漏)
内容的提问来源于stack exchange,提问作者zackychan97
相关产品推荐
相关产品推荐

