ChartTypeとデータの与え方が提示されていないので適当に回答。
以下の方法が考えられます。
- 要素数が2種までであれば、SeriesのXAxisType/YAxisTypeをPrimaryとSecondaryに振り分ける。
- ChartAreaを複数用意して振り分ける。
- データ数が異なっていてもエラーにならないChartTypeに変更する
- 空のポイントを追加する。(以下サンプル)
using System;
using System.Linq;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private System.Windows.Forms.DataVisualization.Charting.Chart chart;
private CheckBox chkFix;
private ListBox list;
private Label label;
public Form1()
{
this.Width = 600;
this.Height = 600;
Panel panel = new Panel();
panel.Width = 150;
panel.Dock = DockStyle.Left;
this.Controls.Add(panel);
list = new ListBox();
list.Dock = DockStyle.Fill;
list.IntegralHeight = false;
list.SelectedIndexChanged += Changed;
list.Items.AddRange(Enum.GetValues(typeof(SeriesChartType)).Cast<object>().ToArray());
chkFix = new CheckBox();
chkFix.Text = "データ数を補正";
chkFix.CheckedChanged += Changed;
chkFix.Dock = DockStyle.Bottom;
label = new Label();
label.Dock = DockStyle.Bottom;
label.Font = new System.Drawing.Font(this.Font.FontFamily, 20);
label.ForeColor = Color.Red;
panel.Controls.Add(list);
panel.Controls.Add(chkFix);
panel.Controls.Add(label);
list.SelectedItem = SeriesChartType.StackedBar100;
}
void Changed(object sender, EventArgs e)
{
SeriesChartType chartType = (SeriesChartType)list.SelectedItem;
if (chart != null)
{
this.Controls.Remove(chart);
}
ChartArea area = new ChartArea();
chart = new Chart();
chart.Dock = DockStyle.Fill;
chart.ChartAreas.Add(area);
Random rnd = new Random();
int[] counts;
counts = new int[] { 10, 10 };
for (int i = 0; i < counts.Length; i++)
{
var seri = new System.Windows.Forms.DataVisualization.Charting.Series();
seri.ChartType = chartType;
chart.Series.Add(seri);
for (int x = 0; x < counts[i]; x++)
{
seri.Points.AddXY(x, rnd.Next(100));
}
}
//2個目のSeriesのデータ数を不一致にする
chart.Series[1].Points.RemoveAt(3);
chart.Series[1].Points.RemoveAt(5);
if (chkFix.Checked)
{
//空のデータを挿入してデータ数を揃えさせる
var names = string.Join(",", chart.Series.Select(_ => _.Name));
chart.DataManipulator.InsertEmptyPoints(1, IntervalType.Number, names);
}
chart.Dock = DockStyle.Fill;
this.Controls.Add(chart);
this.Controls.SetChildIndex(chart, 0);
label.Text = "エラー?";
chart.Paint += (s2, e2) => { label.Text = ""; };
}
}
}
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)