Я бы сделал что-то такое:
1) Создайте 2 пользовательских элемента управления, содержащие mschart, и назовите их, например, PieChartControl
и BarChartControl
. Предоставьте метод для установки текущего источника данных (например, SetDataSource(DataTable dt)
) и поместите туда логику для привязки источника данных к PieChart или BarChart
2) Создайте 3 формы: в Form1
добавьте PieChartControl
, в Form2
добавьте BarChartControl
и в Form3
добавьте SplitContainer
, где вы добавите PieChartControl
и BarChartControl
.
3) Экспонировать метод SetDataSource()
также в Form1
и Form2
(он просто вызовет соответствующий метод внутреннего контроля)
4) Выставить также SetDataSource()
метод в Form3
; он будет вызывать как SetDataSource()
методы внутреннего PieChartControl
, так и BarChartControl
.
5) Form3
должен также предоставить пользовательское свойство (например, ChartClicked
), указывающее на диаграмму, по которой щелкнули
6) В форме 3 подпишитесь на событие Click
(или DoubleClick
, если хотите) на PieChartControl
и BarChartControl
7) Когда срабатывает событие Click
, просто установите свойство ChartClicked и закройте форму
Ниже приведены примеры кода, которые помогут вам понять мое объяснение.
Список помощников:
public enum ChartClicked { None = 0, Pie = 1, Bar = 2 }
MainForm:
// this is the form that have the button to open Form3
public partial class MainForm: Form
{
// other methods ...
private void openForm3ButtonClick(object sender,Eventargs e)
{
Form3 f3 = new Form3();
f3.SetDataSource(this.dataSrc)
f3.ShowDialog();
if(f3.ChartClicked == ChartClicked .Pie)
{
Form1 f1 = new Form1();
f1.SetDataSource(this.dataSrc);
f1.ShowDialog();
}
else if(f3.ChartClicked == ChartClicked .Bar)
{
Form2 f2 = new Form2();
f2.SetDataSource(this.dataSrc);
f2.ShowDialog();
}
}
}
Форма Form3:
// the form having the 2 controls
public partial class Form3: Form
{
// other methods ...
public ChartClicked ChartClicked { get; private set; }
public Form3()
{
this.InitializeComponents();
this.PieChartControl.Click += chartControlClicked;
this.BarChartControl.Click += chartControlClicked;
}
public void SetDataSource(object src)
{
this.PieChartControl.SetDataSource(src);
this.BarChartControl.SetDataSource(src);
}
private void chartControlClicked(object sender, EventArgs e)
{
if(sender == this.PieChartControl)
this.ChartClicked = ChartClicked .Pie;
else if(sender == this.BarChartControl)
this.ChartClicked = ChartClicked .Bar;
this.Close();
}
}
Form1:
// the form having the pie chart control
public partial class Form1: Form
{
// other methods ...
public void SetDataSource(object src)
{
this.PieChartControl.SetDataSource(src);
}
}
Форма 2:
// the form having the bar chart control
public partial class Form2: Form
{
// other methods ...
public void SetDataSource(object src)
{
this.BarChartControl.SetDataSource(src);
}
}
PieChartControl:
public partial PieChartControl: UserControl
{
// other methods ...
public void SetDataSource(object src)
{
// set the series type to Pie etc...
this.chart.DataSource = src;
}
}