gpt4 book ai didi

c# - 从数据表绘制图表

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:52 25 4
gpt4 key购买 nike

我正在尝试绘制一个包含多个系列的图表。它的数据来自数据库,通过 DataAdapter 进入 DataTable,如下所示;

public DataTable deaths_per_reason_per_year(string farmerid)
{
dt = new DataTable();
try
{
conn.Open(); // (select formatted to fit SO lines)
SqlCommand cmd = new SqlCommand("SELECT DATEPART(yyyy, DeathDate) AS 'Year',
Reason,
COUNT(DeathID) AS 'Number of Deaths' FROM [Farmstat_V1.0].[dbo].[Death]
WHERE FarmerID = '" + farmerid + "'
GROUP BY Reason, YEAR(DeathDate);", conn);
SqlDataReader reader = cmd.ExecuteReader();
dt.Load(reader);
}
catch (Exception)
{
throw;
}
finally
{
conn.Close();
}
return dt;
}

这给了我以下输出;

DataTable with the sql output

当我尝试将 DataTable 分配给表单上的图表时,用这个;

StatsDataAccess sda = new StatsDataAccess();

chart1.DataSource = sda.deaths_per_reason_per_year(FarmerID);
chart1.Series["Series1"].XValueMember = "Year";
chart1.Series["Series1"].YValueMembers = "Number of Deaths";
chart1.Series["Series2"].XValueMember = "Reason";
chart1.Series["Series2"].YValueMembers = "Number of Deaths";
chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.Enabled = false;
chart1.Series["Series1"].IsValueShownAsLabel = true;
chart1.DataBind();

我得到了一个看起来像这样的绘制图表,我已经通过图表的属性 Pane 在其中添加了系列;

output

但我想要一个应该看起来像这样的输出;

actual output

我试过 googleing 但没有成功。有人可以帮我解决这个问题吗?我会非常感激。谢谢

最佳答案

最明显的问题是关于 x 值的数据类型。

所有 X 值在内部都是 double 类型。

简介

  • 如果您添加 X 值中带有数字的 DataPoints,它们将按预期处理和存储
  • 如果您添加 DataPointsDateTime X 值,它们也会转换为 double 值(通过 OLE 自动化日期转换)

但是如果你添加不能转换为数字的类型,比如字符串,事情就会变得很奇怪。 在内部 X 值都是0,因为除了标签显示 字符串之外它们还能是什么。

显示的 DataPoints 被视为具有 0,1,2,3... 的 X 值,并且这些点以漂亮且相等的间距显示。

对于许多新手来说,这看起来不错,他们永远不知道他们实际上失去了 X 值。

当尝试使用数字格式或尝试使用 X 值进行计算时,他们的问题就来了。

你的问题

你的“问题”是你的 selectDATEPART 函数中传递整数,所以你做对了,事实上你做得太好了,无法计算出盒子..

听起来非常不错而且是..

..然而 Chart 尝试显示许多具有 Auto 设置的项目,虽然它们通常 工作正常,但在这里他们不这样做,因为他们试图从 x = 0 开始图表,当然 2014-2016 的三个实际值被挤到右边,面目全非。

解决方法很简单:设置显示最小值:

chart1.ChartAreas["ChartArea1"].AxisX.Minimum = 2014;

一切顺利。您可能希望根据 Points 中的 x 值计算该值,万岁,您可以,因为您拥有它们..

这是最好的方法,只要您的系列具有有意义的 X 值数字。

不幸的是,第二个系列似乎没有......

丑陋的替代方法是将年份转换为字符串,但是,除非你真的必须这样做,否则不要这样做!

解决缩放问题后,您的代码的另一个大问题变得可见:

您的数据映射有误。

比较数据表和所需的输出,您的数据绑定(bind)根本不会映射到那样的图表。

解决方案:您应该数据分成尽可能多的独立来源,因为您有原因,即因为您有系列要绑定(bind)。

我会为每个 reason 创建一个单独的 DataViews,每个都基于相同的 DataTable 但具有不同的 Filter (reason = 'reason1'..) 然后将每个 DataView 绑定(bind)到一个 Series

在我的脑海中,这就是它的样子:

DataTable DT = yourTable;

DataView dv1 = new DataView(DT);
DataView dv2 = new DataView(DT);
..
dv1.RowFilter = "reason=='Sold'";
dv2.RowFilter = "reason=='Other'";
..
yourSeries1.Points.DataBind(dv1, "year", "deathcount", "");
..

现在所有 Series DataPoints 都以相同的方式绑定(bind),所有 Series 显示并且缩放比例固定。

关于c# - 从数据表绘制图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33588055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com