You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms中根据ListBox选中项动态绘制对应数量图表的疑问

解决方案

要实现根据ListBox选中项绘制对应图表,需要针对原代码的几个核心问题进行修改,以下是具体步骤和代码:

原代码存在的问题

  1. 未填充DataSet(缺少da.Fill(ds)),导致Chart无数据可显示
  2. 固定配置所有Series,无论选中项是什么都会显示全部图表
  3. 未正确关闭数据库连接,存在资源泄漏风险

修改后的完整代码

方式一:清空现有Series,根据选中项重新创建(推荐,更简洁)

private void button1_Click_1(object sender, EventArgs e)
{
    // 获取ListBox中选中的项,转换为字符串列表
    var selectedItems = listBox1.SelectedItems.Cast<string>().ToList();
    
    // 无选中项时提示并返回
    if (selectedItems.Count == 0)
    {
        MessageBox.Show("请先选择要绘制的项");
        return;
    }

    // 动态构建SQL查询语句,仅查询选中的字段和日期字段
    string selectedFields = string.Join(", ", selectedItems) + ", valuedate";
    string mysql = $"SELECT {selectedFields} FROM mydata";

    // 使用using语句自动释放数据库资源,避免泄漏
    using (MySqlConnection conn = new MySqlConnection(connect.ConnectionString))
    using (MySqlDataAdapter da = new MySqlDataAdapter(mysql, conn))
    {
        DataSet ds = new DataSet();
        da.Fill(ds, "mydata"); // 将查询结果填充到DataSet

        // 清空Chart中已有的Series,避免重复绘制
        chart1.Series.Clear();

        // 遍历选中项,为每个项创建并配置对应Series
        foreach (var item in selectedItems)
        {
            Series series = new Series(item)
            {
                XValueMember = "valuedate", // 设置X轴为日期字段
                YValueMembers = item,       // 设置Y轴为选中的数值字段
                ChartType = SeriesChartType.Line // 可根据需求修改图表类型,如Column、Bar等
            };
            chart1.Series.Add(series);
        }

        // 绑定数据源并刷新Chart
        chart1.DataSource = ds.Tables["mydata"];
        chart1.DataBind();
    }
}

方式二:控制现有Series的可见性(适合需要保留Series配置的场景)

private void button1_Click_1(object sender, EventArgs e)
{
    var selectedItems = listBox1.SelectedItems.Cast<string>().ToList();
    
    if (selectedItems.Count == 0)
    {
        MessageBox.Show("请先选择要绘制的项");
        return;
    }

    string selectedFields = string.Join(", ", selectedItems) + ", valuedate";
    string mysql = $"SELECT {selectedFields} FROM mydata";

    using (MySqlConnection conn = new MySqlConnection(connect.ConnectionString))
    using (MySqlDataAdapter da = new MySqlDataAdapter(mysql, conn))
    {
        DataSet ds = new DataSet();
        da.Fill(ds, "mydata");

        chart1.DataSource = ds.Tables["mydata"];

        // 遍历现有Series,设置可见性:仅选中项对应的Series可见
        foreach (Series series in chart1.Series)
        {
            series.Visible = selectedItems.Contains(series.Name);
            if (series.Visible)
            {
                // 重新绑定数据确保显示最新内容
                series.XValueMember = "valuedate";
                series.YValueMembers = series.Name;
            }
        }

        // 若选中项不存在于现有Series中,添加新的Series
        foreach (var item in selectedItems)
        {
            if (!chart1.Series.Contains(item))
            {
                Series series = new Series(item)
                {
                    XValueMember = "valuedate",
                    YValueMembers = item,
                    ChartType = SeriesChartType.Line,
                    Visible = true
                };
                chart1.Series.Add(series);
            }
        }

        chart1.DataBind();
    }
}

关键修改点说明

  • 动态获取选中项:通过listBox1.SelectedItems获取用户选择的内容,确保只处理需要的项
  • 按需查询数据:动态构建SQL语句,仅查询选中的字段,减少数据传输开销
  • 资源自动管理:使用using语句确保数据库连接和DataAdapter自动释放,避免资源泄漏
  • 动态配置图表:根据选中项创建或显示对应Series,未选中的项不会出现在图表中
  • 数据填充与绑定:补充da.Fill(ds)填充数据,调用DataBind()确保图表刷新显示

内容的提问来源于stack exchange,提问作者kris.k20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:05:49