图表控件将Y值分配给特定的X值

时间:2014-02-04 12:46:36

标签: c# sql asp-classic charts

我有一个主页,其中的图表需要显示X值的最后五个日期。 Y值需要显示在注册日期的过去五天内注册的小时数。例如,过去五天:

31-01-2014
01-02-2014
02-02-2014
03-02-2014
04-02-2014

如果在这些日期有任何注册,则需要显示已注册的小时数。

sql查询选择4天前和今天之间注册的日期和时间。 X值现在由我创建的IEnumerable给出,其中包含过去5天的列表。我将其粘贴为DatabindXY中的X值成员。我将小时的结果粘贴为y值。问题是,它将y值分配给不正确的日期。我明白为什么它不起作用,因为我没有任何逻辑告诉图表将y值分配给正确的日期。查询的日期结果未在任何地方用于分配正确的值。因此,如果我在2月2日完成了注册(发生在不同页面上),则图表会将注册分配给x值中出现的第一个日期。在这种情况下31-01-2014。

如何正确地将Y值分配到正确的日期? 我没有那么长时间的编程,我之前也没有做任何关于图表控件的事情。我需要使用Datamanipulator功能吗?或者在图表的数据绑定中编写逻辑?我在网上搜索过,无法弄明白。

对不起,如果问题不清楚。英语不是我的母语:)。

我在页面加载中到目前为止的代码是:

List<object> lijst = new List<object>();
lijst.Add(DateTime.Now.Date.AddDays(-4));
lijst.Add(DateTime.Now.Date.AddDays(-3));
lijst.Add(DateTime.Now.Date.AddDays(-2));
lijst.Add(DateTime.Now.Date.AddDays(-1));
lijst.Add(DateTime.Now.Date);

IEnumerable<object> data = lijst;
string begin = DateTime.Now.AddDays(-4).Date.ToString("yyyy-MM-dd hh:mm:ss");
string eind = DateTime.Now.AddDays(1).Date.ToString("yyyy-MM-dd hh:mm:ss");

SqlCommand cmdChart = new SqlCommand("SELECT SUM(Minuten) / 60 as Minuten, Datum FROM Uren WHERE         Datum BETWEEN @Begin AND @Eind AND WerknemerID = @WerknemerID  GROUP BY Datum ORDER BY Datum ", con);
cmdChart.Parameters.AddWithValue("@WerknemerID", Session["werknemer"]);
cmdChart.Parameters.AddWithValue("@Begin", begin);
cmdChart.Parameters.AddWithValue("@Eind", eind);
con.Open();

Chart1.DataSource = cmdChart.ExecuteReader();
Chart1.DataBind();
con.Close();
con.Open();
SqlDataReader myRead;
myRead = cmdChart.ExecuteReader();

Chart1.ChartAreas[0].AxisX.Title = "Datum";
Chart1.ChartAreas[0].AxisY.Title = "Uren geregistreerd";

Chart1.AlternateText = "Laatste 5 dagen geen uren geregistreerd";

Chart1.Series["Testing"].XValueType = ChartValueType.DateTime;
Chart1.Series["Testing"].Points.DataBindXY(data, "Datum", myRead, "Minuten");

con.Close();

解决:

public class ChartPoint
{
    public DateTime x { get; set; }
    public string y { get; set; }
}

        DataTable table = new DataTable();
        SqlDataReader dr = cmdChart.ExecuteReader();

        table.Load(dr);
        con.Close();

        List<ChartPoint> ChartPoints = new List<ChartPoint>();
        ChartPoints.Add(new ChartPoint() { x = DateTime.Now.Date.AddDays(-4), y = "0" });
        ChartPoints.Add(new ChartPoint() { x = DateTime.Now.Date.AddDays(-3), y = "0" });
        ChartPoints.Add(new ChartPoint() { x = DateTime.Now.Date.AddDays(-2), y = "0" });
        ChartPoints.Add(new ChartPoint() { x = DateTime.Now.Date.AddDays(-1), y = "0" });
        ChartPoints.Add(new ChartPoint() { x = DateTime.Now.Date, y = "0" }); 


        for (int i = 0; i < table.Rows.Count; i++)
        {
            DateTime Xdate = (DateTime)table.Rows[i]["Datum"];
            string Yminuten = table.Rows[i]["Minuten"].ToString();
            int index = lijst.IndexOf((DateTime)table.Rows[i]["Datum"]);
            ((ChartPoint)ChartPoints[index]).x = Xdate;
            ((ChartPoint)ChartPoints[index]).y = Yminuten;
        }

        Chart1.Series["Testing"].Color = Color.CadetBlue;
        foreach (var item in ChartPoints)
        {
            Chart1.Series["Testing"].Points.AddXY(item.x.ToString(), item.y);
        }
        Chart1.DataBind();

感谢指导我走正确的道路Somnath。

1 个答案:

答案 0 :(得分:2)

将结果存入数据表“table”并尝试使用以下用于您的代码

DataTable table= new DataTable();
SqlDataReader dr = cmd.ExecuteReader();
SqlDataReader dr = cmd.ExecuteReader();

table.Load(dr);

for (int i = 0; i < table.Rows.Count; i++)
{
    Xdate= table.Rows[i]["Datum"].ToString();
    Yminuten= table.Rows[i]["Minuten"].ToString();

    Chart1.Series["Testing"].Points.AddXY(Xdate, Yminuten);               
    Chart1.Series["Testing"].Color = Color.Goldenrod;
}    

Chart1.DataBind();

我希望这对你有用