将图表数据绑定到日期选择器以显示自定义时间线

Posted

技术标签:

【中文标题】将图表数据绑定到日期选择器以显示自定义时间线【英文标题】:bind chart data to datepicker to show custom timeline 【发布时间】:2021-03-28 20:37:21 【问题描述】:

我是 C# 的新手

我在我的 WinForms 应用程序中创建了一个条形图,通过将它们连接到 MSSQL 存储过程作为数据源,但我需要提供一个日期选择器功能(从和到),当用户选择日期时,只有那么多过滤后的数据应该填充到图表中,但是每当我点击更新按钮时,图表都会额外获取数据(见图)而不是过滤。

我的图表程序:

create proc toprej
@fromDate date,
@toDate date
as
select top 10 RejectReason1 as Reason, Sum(NetWt) as Quantity
from IP_Spools
Where status = 'Reject' AND DOE between  @fromDate  and  @toDate
group by RejectReason1
order by Sum(NetWt) desc
go

我在 winform 中的图表代码:

    private void GraphToprej()
            
                SqlConnection con = new SqlConnection(cs);
                SqlCommand cmd = new SqlCommand("Toprej", con);
                cmd.Parameters.AddWithValue("@fromDate", dtfrom.Value);
                cmd.Parameters.AddWithValue("@toDate", dtto.Value);
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                
                    Rejcategory.Add(dr.GetString(0));
                    RejSum.Add(dr.GetInt32(1));
                
                ChartTopRej.Series[0].Points.DataBindXY(Rejcategory, RejSum);
                dr.Close();
                con.Close();
            
private void datefil_Click(object sender, EventArgs e)
        
            GraphToprej();
        

图片如下:

请帮我解决这个问题..

【问题讨论】:

【参考方案1】:

在这种情况下,您必须在每次单击按钮时重新创建图形对象。为此,您必须清除图形控件。例如,您按日期范围将数据发送到列表框中。当您更改日期范围并再次发送数据时,您应该使用 listbox1.Items.Clear() 清除此列表框。

private void datefil_Click(object sender, EventArgs e)

    //--> Here you have to clear your graphic object.
    // for example lboxData.Items.Clear();

    GraphToprej();

你是 C# 的新手,所以我想提个建议

我的建议是将这个链接与一个类分开并从一个点处理它。我建议你研究关注点分离(SoC)这个主题。

另外,我建议您按如下方式运行您的代码。 Using 块处理对象并自动关闭连接。

using (SqlConnection connection = new SqlConnection("..."))

    conn.Open();
    //commands

更新

我更详细地阅读了您写的问题here。问题是您在全局范围内定义 ArrayList 对象。在这样的定义中,数据保留在内存中,您需要清除它。您可以在方法中定义它,也可以在全局范围中编写它并在方法中创建一个实例。

你可以试试这个,我试过了

private void GraphToprej()

    ArrayList Rejcategory = new ArrayList();
    ArrayList RejSum = new ArrayList();

    //then write SqlConnection and other codes...

//Global Scope
ArrayList Rejcategory;
ArrayList RejSum;

//Your Method
private void GraphToprej()

    Rejcategory = new ArrayList();
    RejSum = new ArrayList();
    
    //then write SqlConnection and other codes...

【讨论】:

嗨@Volkan Barbaros Gurcan ..我在方法调用上方尝试了charttoprej.series.clear() ;,但现在我得到索引超出范围异常。实际问题是每次我单击按钮而不是更新时,图表都会添加新值。

以上是关于将图表数据绑定到日期选择器以显示自定义时间线的主要内容,如果未能解决你的问题,请参考以下文章

如何设置日期选择器以单独显示 1910-2010 之间的年份

无法获取引导日期时间选择器以在表单字段中显示格式化的数据库值

如何验证日期选择器以禁止/拒绝某些日期?

格式化日期选择器以发布到 MySQL DB

自定义水平滚动日历

添加日期选择器以编程方式查看?