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

C# 将图表数据绑定到日期选择器以显示自定义时间线,c#,sql-server,visual-studio,winforms,C#,Sql Server,Visual Studio,Winforms,我对c很陌生# 我已经在我的WinForms应用程序中创建了一个条形图,通过将它们连接到MSSQL存储过程作为数据源,但我需要提供一个日期选择器函数(from和to),当用户选择日期时,只需将过滤过的数据填充到图表中,但每当我单击update按钮,图表将额外获取数据(参见图片),而不是进行过滤 我的查特程序: create proc toprej @fromDate date, @toDate date as select top 10 RejectReason1 as Reason, Sum(

我对c很陌生#

我已经在我的WinForms应用程序中创建了一个条形图,通过将它们连接到MSSQL存储过程作为数据源,但我需要提供一个日期选择器函数(from和to),当用户选择日期时,只需将过滤过的数据填充到图表中,但每当我单击update按钮,图表将额外获取数据(参见图片),而不是进行过滤

我的查特程序:

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();
        }
图为:


请帮助我解决此问题。

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

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

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

此外,我建议您按如下方式运行代码<代码>使用块处理对象并自动关闭连接

using (SqlConnection connection = new SqlConnection("..."))
{
    conn.Open();
    //commands
}
更新

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

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

private void GraphToprej()
{
    ArrayList Rejcategory = new ArrayList();
    ArrayList RejSum = new ArrayList();

    //then write SqlConnection and other codes...
}


你好@Volkan Barbaros Gurcan..我试过
charttoprej.series.clear()在方法调用上方,但现在我得到索引超出范围异常。实际问题是每次单击按钮时,图表都会添加新值,而不是更新。
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...
}