我有一个主页,其中的图表需要显示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。
答案 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();
我希望这对你有用