首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -在没有第一次ChartArea的情况下向下滚动图表

C# -在没有第一次ChartArea的情况下向下滚动图表
EN

Stack Overflow用户
提问于 2017-09-18 07:50:50
回答 1查看 1.3K关注 0票数 0

我想要的结果是一个主图和几个子图,它们与主图同步。(子图表必须与主图共享相同的x轴。)

一开始,我使用多个chartAreas进行了尝试。我可以同步子chartAreas和主chartArea。(使用这个:How to align two (or more) charts in size, scroll and grid)这个正是我想要的。但是我不能只垂直滚动子chartAreas。如果我滚动,所有的图表都是滚动的。我只想垂直滚动子chartAreas。(在顶部显示主chartArea,甚至在滚动条关闭时)

因此,我扭转了使用多个图表(而不是图表区域)的决定。我可以把它们放到TableLayoutPanel里。每行一张图表。那我就不能同步它们的x轴了.

有没有任何方法来同步一个x轴与多个图表?还是只使用多个chartAreas滚动子图区域?

我所说的“滚动”是指垂直滚动。见这里:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-18 12:52:42

从图片和注释中,我发现您实际上希望向下滚动一个带有几个ChartArea的图表,但在顶部保持一个固定的图表。

(如果是这样的话,你应该更正问题标题!)

默认情况下,Chart只能在缩放的 ChartArea中滚动数据,而不能在Chart中滚动几个ChartAreas

这里是一个伪造ChartArea 滚动冻结顶级ChartArea的例子。

以下是必要的步骤:

  • 我们需要一个VerticalScrollbar控件并将其锚定在图表的右侧。
  • 我们需要将它的最小值和最大字段设置为适当的值;我在0中保留了最小值,并用几个参数计算了最大值。
  • 然后我们可以编码它的Scroll事件..:
代码语言:javascript
复制
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
    float h = (100 - yOffTop - yOffBottom) / visibleCount;
    ChartArea main = chart1.ChartAreas[0];

    for (int i = 1; i < chart1.ChartAreas.Count; i++)
    {
        ChartArea ca = chart1.ChartAreas[i];
        ca.Position = new ElementPosition(0, h * i - vScrollBar1.Value + mainExtra, 80, h);
        ca.Visible = ca.Position.Y  >= main.Position.Bottom ;
    }
}

visibleCount控制可见的ChartAreas数。在这个例子中,我有一个年度,固定在顶部,另外12个月..:

为此,您需要设置图表,以便以适当的方式对图表区域进行简化。

我使用了这段代码,使用您自己的代码,比如右空格(我留了20%用于图例)等等:

代码语言:javascript
复制
    int visibleCount = 5;
    float yOffTop = 0;     // no extra top space for a chart title
    float yOffBottom = 0;  // no extra  bottom space either
    float mainExtra = 6;   // a few extra% for the main CA's axis labels

    private void Init_button_Click(object sender, EventArgs e)
    {
        chart1.Series.Clear();
        chart1.ChartAreas.Clear();
        chart1.BackColor = Color.Snow;
        float h = (100 - yOffTop - yOffBottom) / visibleCount;
        for (int i = 0; i < 13; i++)
        {
            float yOff = i != 0 ? mainExtra : 0;
            float yExtra = i == 0 ? mainExtra : 0;
            ChartArea ca = chart1.ChartAreas.Add("ca" + i);
            ca.Position = new ElementPosition(0, h * i + yOff , 80, h + yExtra);
            ca.BackColor = Color.FromArgb(i * 20, 255 - i * 3, 255);
            ca.AxisX.IntervalOffset = 1;

            Series s = chart1.Series.Add("s" + i);
            s.ChartArea = ca.Name;
            for (int j = 1; j < 30; j++)
            {
                s.Points.AddXY(j, rnd.Next(100) - rnd.Next(20));
            }
            chart1.ChartAreas[0].BackColor = Color.Silver;
            ca.AxisY.Title = i == 0 ? "Year" :
                                       DateTimeFormatInfo.CurrentInfo.GetMonthName(i);
            ca.AxisX.Enabled = (i == 0) ? AxisEnabled.True :  AxisEnabled.False;
        }
        vScrollBar1.Minimum = 0;// (int)( h);
        vScrollBar1.Maximum = (int)((chart1.ChartAreas.Count - visibleCount + 0.5f) * h
                                   + mainExtra );
    }

我在每个CA周围画出额外的矩形,只是为了测试;请忽略它们!

注意:使用这些百分比总是有点棘手,可能需要一些调整!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46274181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档