C# WinForms绑定MSSQL存储过程的柱状图结合日期选择器实现自定义时间查询时数据追加问题求助
WinForms日期筛选柱状图数据重复叠加问题解决
根因定位
当前实现出现数据叠加的核心原因:
- 存储图表分类项、数值的
Rejcategory、RejSum是类级别的全局列表,每次调用GraphToprej()方法时,仅会向列表中追加新查询到的数据,从未清空之前残留的历史数据,多次点击筛选按钮后,列表会累积多次查询的全量数据 - 图表系列绑定新数据源前,未清空当前已存在的数据点,容易出现旧点残留的叠加效果
修改方案
在每次加载新的筛选数据前,先清空所有历史缓存数据,再执行新的查询绑定,同时优化数据库资源释放逻辑:
- 查询新数据前,清空两个全局列表的历史内容
- 绑定新数据前,清空图表系列已有的所有旧数据点
- 用
using块包裹数据库连接、命令、读取器对象,自动释放资源,避免手动关闭不彻底导致的连接泄漏
修改后可用的完整代码
// 全局定义的图表数据源列表,需每次查询前清空 private List<string> Rejcategory = new List<string>(); private List<int> RejSum = new List<int>(); private void GraphToprej() { // 清空历史累积的列表数据 Rejcategory.Clear(); RejSum.Clear(); // 清空图表上残留的旧数据点 ChartTopRej.Series[0].Points.Clear(); // using块自动释放数据库连接资源 using (SqlConnection con = new SqlConnection(cs)) { using (SqlCommand cmd = new SqlCommand("Toprej", con)) { // 取控件的日期部分传参,避免时分秒导致边界日期查询异常 cmd.Parameters.AddWithValue("@fromDate", dtfrom.Value.Date); cmd.Parameters.AddWithValue("@toDate", dtto.Value.Date); cmd.CommandType = CommandType.StoredProcedure; con.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { Rejcategory.Add(dr.GetString(0)); RejSum.Add(dr.GetInt32(1)); } } } } // 绑定新查询到的日期范围数据 ChartTopRej.Series[0].Points.DataBindXY(Rejcategory, RejSum); } private void datefil_Click(object sender, EventArgs e) { GraphToprej(); }
说明
你编写的toprej存储过程本身逻辑完全正常,不需要做任何修改,只要修正前端绑定逻辑中未清空历史数据的问题,即可实现“选择日期范围后,图表仅展示对应范围数据、替换原有内容”的预期效果。
内容的提问来源于stack exchange,提问作者RaviKumar
相关产品推荐
相关产品推荐

