2016-12-15 39 views
1

我试图创建一个从以下数据表中的图表: DataTable1DataTable2ASP.NET图表 - 动态图表错误地建

在我的aspx页面,我有一个简单的图表,代码如下:

<asp:Chart ID="chartTipo1" runat="server" BackColor="Transparent" Palette="Pastel" TextAntiAliasingQuality="High" Width="1400px" Height="500px" Visible="false"> 
    <Series></Series> 
    <ChartAreas> 
     <asp:ChartArea Name="ChartArea1"> 
      <AxisX IsStartedFromZero="True" LineColor="LightGray" LabelAutoFitStyle="LabelsAngleStep30" IsLabelAutoFit="true"> 
       <MajorGrid LineColor="White" /> 
      </AxisX> 
      <AxisY LineColor="LightGray"> 
       <MajorGrid LineColor="LightGray" /> 
      </AxisY> 
     </asp:ChartArea> 
    </ChartAreas> 
    <Legends> 
     <asp:Legend BorderWidth="1"></asp:Legend> 
    </Legends> 
</asp:Chart> 

和代码隐藏:

//first add your series 
foreach (DataRow row in dtTipos.DefaultView.ToTable(true, new string[] { "Type"}).Rows) 
{ 
    Series series = new Series(); 
    series.Name = (string)row["Type"]; 
    series.ChartType = SeriesChartType.StackedColumn; 
    chartTipo1.Series.Add(series); 
} 

// then add your points; 
foreach (DataRow row in dtTipos.Rows) 
    chartTipo1.Series[(string)row["Type"]].Points.AddXY(row["Location"], new object[] { row["Total"] }); 

double pInicial = 0.5; 
for (int i = 0; i < listaLocais.Count; i++) 
{ 
    chartTipo1.ChartAreas[0].AxisX.CustomLabels.Add(pInicial, pInicial + 1, listaLocais[i]); 
    chartTipo1.ChartAreas[0].AxisX.IsStartedFromZero = true; 
    pInicial = pInicial + 1; 
} 

我创建了一系列针对每个不同的类型,然后加点。之后,我为每列添加一个标签(我应该有6个不同的列,从6个不同的位置)。

生成的图表如下: enter image description here

正如你可以看到,图表错误的,因其位置“Azeitão”只有相关的一个类型,而不是更多的图表中显示。

我在做什么错?

+0

这意味着您正在以错误的方式构建您的系列文件....首先构建您的位置坐标轴,然后仅为该位置添加客户端(您应该先检查客户端是否属于该位置,然后再将其添加到系列中) – Hackerman

+0

那么我的系列应​​该是类型还是位置? –

+1

如果某个特定的'Location'没有特定的'Type',则必须添加那个位置类型对,其'Total'值为0(零)。然后它会按照您的期望工作。对于这种特定类型的堆栈柱状图,您不能简单地将数据表转换为“丢失”数据。图表本身并不“足够聪明”,无法为你全部找到答案。你必须对你的数据进行处理,并将结构和一致性提供给图表。 – jsanalytics

回答

1

有了@jstreet的帮助,我能够解决我的问题。

我做了什么:
我创建了一个包含所有不同位置的列表和一个包含所有不同类型的列表。然后,我的DataTable中的行,每行一个,我搜索了这个位置,这种类型的一排,用

DataRow[] lRow = dtTipos.Select("LOCATION= '" + l + "' AND TYPE= '" + t + "'"); 

然后,如果我发现了一排,我会一个点添加到系列对应的值,否则我会添加一个值为0的点到列,以便我可以为每个位置不存在的每个类型创建一个空列。

问题解决。

+0

干得好我的朋友! – jsanalytics