Multiple chart areas in one column

Viewed 368

I have a chart with multiple chart areas. When I press a button a new chart area is being created etc. My problem is that after adding some chart areas I get the following result : enter image description here I want to have each chart area in only one column, one after the other like this : enter image description here

is this possible ?

EDIT: Adding chart areas dynamically enter image description here

on the left it is the chart with 3 chart areas added and the right is the chart with 4 areas.

2 Answers

Use property ChartArea.AlignWithChartArea

Through the use of the AlignWithChartArea, AlignmentOrientation and AlignmentStyle properties, it is possible to align or synchronize two or more chart areas horizontally, vertically or both.

First, set the AlignWithChartArea property to the name of a ChartArea object. This chart area will then be aligned, based on the AlignmentStyle setting, which defines the alignment to use, and the AlignmentOrientation setting, which defines the elements of the chart area that should be used to set the alignment.

So to put ChartArea2 below ChartArea1:

ChartArea2.AlignWithChartArea1;
ChartArea2.AlignmentStyle = AreaAlignmentStyles.Position;
ChartArea2.AlignmentOrientation = AreaAlignmentOrientation.Vertical;

Here is how you can achive what you need, also referring for your question here:
https://stackoverflow.com/questions/67124754/dynamically-add-chart-areas-in-vertical-alignment

Use the Position property and please read comments inside the code:

private void button1_Click(object sender, EventArgs e)
{
    List<ChartArea> Areas = new List<ChartArea>();
    int numberOfAreas = 5;
    chart1.Legends[0].Enabled = false;

    for (int k = 1; k <= numberOfAreas; k++) // YOU WANT 5 and not 4 AREAS - changed k< to k<=
    {
        var S1 = new Series();
        chart1.Series.Add(S1);
        S1.Name = k.ToString();
        for (int j = 0; j < 100; j += 10) S1.Points.AddXY(j, j / 10);
        S1.Color = Color.Transparent;

        Areas.Add(new ChartArea(k.ToString()));
        chart1.ChartAreas.Add(Areas[k - 1]); // IT IS k-1 and not k - we start counting from 0                 
        S1.ChartArea = k.ToString();
        chart1.ChartAreas[k - 1].AlignWithChartArea = chart1.ChartAreas[k - 1].Name;
        chart1.ChartAreas[k - 1].AlignmentStyle = AreaAlignmentStyles.Position;
        chart1.ChartAreas[k - 1].AlignmentOrientation = AreaAlignmentOrientations.Vertical;
    }

    // NOW THE IMPORTANT PART
    float currentHeight = 0;
    foreach (var itm in Areas)
    {
        itm.Position.Height = 100 / numberOfAreas; // Note: the valus are in percenteges and not absolute pixels
        itm.Position.Y = currentHeight;
        itm.Position.X = 5;
        itm.Position.Width = 95;
        currentHeight += 100 / numberOfAreas;
    }

}

OUTPUT: enter image description here

Related