我需要从One Series转到Two Series

时间:2010-11-22 12:44:49

标签: c# .net charts logic

我们使用dotNETCHARTING来描绘我们的图表,他们为Series接受SeriesCollection。这是我正在研究的新图表,所有以前的图表在显示的值和提取的值之间具有1:1的关系。现在我有一个值列表,显示为值12:12的列表。

我目前有2个数据列表显示(实际与过去12个月的预算相比) - 但在一个Series中,它们应为2 Series。我根据需要对数据进行了排序和列出,几乎列在右边。

限制:.NET 3.5(VS2008),dotNETCHARTING。

如果我必须为每个月创建12个SQL,并为预算创建12个SQL,那将是一个非常悲伤的解决方案。我认为没有必要,只要我找到一种方法将每个列表分隔成单独的Series

每个模块都有List<ModuleValue>,我尝试使用Dictionary<int, List<ModuleValue>>,以便每个值系列(12个月)可以有一个单独的列表。

我已经尝试了对于每个值列表,将列表中的每个值添加到Series,重复直到超出值列表。 (Foreach)中的Foreach

我的问题是:任何人都可以给我一些可能的解决方案。下面的图表是正确的,如果没有一个接一个排队,但是在同一时间段(月)开始和结束。例如Jan的预算与Jan的实际比较。我不是在询问dotNETCHARTING模块,他们有很多帮助。我要求中间介入以及如何将数据提供给模块。

主要逻辑主体:

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            //_chart.Type = ChartType.Combo;
            _chart.DefaultSeries.Type = SeriesType.Line;

// Up for change - between here
            IList listSeries = new List();
            listSeries.Add(GetSeries(_module)); // This line should be listSeries = GetMultipleSeries(_module); or to that effect.

            foreach (var series in listSeries)
            {
                _chart.SeriesCollection.Add(series);
            }
// Up for change - and here

            // This shows the title above the chart:
            _chart.Title = _module.Title;
            // This shows the title below the chart:
            //_chart.XAxis.Label = new Label(_module.Title);

            _chart.TitleBox.Line.Color = Charter.BackgroundColor;

            base.SetAreaStyles();
            base.SetLinkUrl(_module.LinkUrl);
        }

这个逻辑是旧的逻辑,应保持原样 - 因为所有其他图表都依赖它。 可以作为参考点。考虑这个逻辑被锁定。

        protected Series GetSeries(FrontModule module)
        {
            Series series = new Series(module.Title);

            foreach (var value in module.Values)
            {
                string sFieldTitle = value.Text;

                Element element = new Element(sFieldTitle, value.Value);

                element.Color = Charter.GetColor(value.ColorIndex);

                series.Elements.Add(element);

                string sToolTip = string.Format
                    ("{0}: {1:N0}"
                    , value.Tooltip
                    , value.Value);

                element.ToolTip = sToolTip;

                if (!string.IsNullOrEmpty(value.LinkUrl))
                {
                    element.URL = Page.ResolveUrl(value.LinkUrl);
                }

                ChartTooltip += string.Concat(sToolTip, ", ");
            }

            ChartTooltip += "\n";

            return series;
        }

这是新的逻辑,应该更改以反映所需的逻辑。认为这是免费的。

        protected List GetMultipleSeries(FrontModule module)
        {
            List listSeries = new List();
            Series series = new Series(module.Title);

            foreach (var keyPair in module.DictionaryValues)
            {
                string sFieldTitle = keyPair.Value.Text;

                Element element = new Element(sFieldTitle, keyPair.Value.Value);

                element.Color = Charter.GetColor(keyPair.Value.ColorIndex);

                series.Elements.Add(element);

                string sToolTip = string.Format
                    ("{0}: {1:N0}"
                    , keyPair.Value.Tooltip
                    , keyPair.Value.Value);

                element.ToolTip = sToolTip;

                if (!string.IsNullOrEmpty(keyPair.Value.LinkUrl))
                {
                    element.URL = Page.ResolveUrl(keyPair.Value.LinkUrl);
                }

                ChartTooltip += string.Concat(sToolTip, ", ");

            }

            listSeries.Add(series);

            ChartTooltip += "\n";

            return listSeries;
        }

alt text

这不应该是这样,将数据列在等值行中。虽然它显示它具有所有必需的数据。

我很感激您可以添加的任何内容。谢谢。

1 个答案:

答案 0 :(得分:1)

您需要两个Series个对象:

    protected List GetMultipleSeries(FrontModule module)
    {
        List listSeries = new List();
        Series seriesActual = new Series(module.Title);
        Series seriesBudgetted = new Series(module.Title);

        foreach (var keyPair in module.DictionaryValues)
        {
            string sFieldTitle = keyPair.Value.Text;

            Element element = new Element(sFieldTitle, keyPair.Value.Value);

            element.Color = Charter.GetColor(keyPair.Value.ColorIndex);

            // Is is actual or budgetted
            if (keyPair.Value.IsActual)
                seriesActual.Elements.Add(element);
            else
                seriesBudgetted.Elements.Add(element);

            string sToolTip = string.Format
                ("{0}: {1:N0}"
                , keyPair.Value.Tooltip
                , keyPair.Value.Value);

            element.ToolTip = sToolTip;

            if (!string.IsNullOrEmpty(keyPair.Value.LinkUrl))
            {
                element.URL = Page.ResolveUrl(keyPair.Value.LinkUrl);
            }

            ChartTooltip += string.Concat(sToolTip, ", ");

        }

        listSeries.Add(seriesActual);
        listSeries.Add(seriesBudgetted);

        ChartTooltip += "\n";

        return listSeries;
    }

我假设您有一些方法可以测试if语句中的点是实际的还是预算的。