我如何将两个表格中的两个图表显示为另一种形式,如概述
本文关键字:两个 另一种 显示 表格 | 更新日期: 2023-09-27 18:08:04
我正在实现图表控件....我有三个表单form1 form2 form3 .....
我正在用饼状图的形式展示一些数据 我正在用柱状图的形式展示一些数据。我的问题是,我想把这两个图表显示在表格3中,就像在视图中一样…用户可以看到所有的图表…
所以当我点击按钮时,表单3将打开两个图表并排(一个是form1的饼状图,另一个是form2的条形图)如果你点击form3中的其中一个图表它将进入相应的表单。像这样....
有人知道如何实现这个吗?
Many Thanks advance....
我会这样做:
1)创建2个包含mschart的用户控件,并将其命名为PieChartControl
和BarChartControl
。暴露一个方法来设置当前的数据源(例如SetDataSource(DataTable dt)
),并把逻辑绑定到数据源的PieChart或条形图
2)创建3个表单:在Form1
添加PieChartControl
,在Form2
添加BarChartControl
,在Form3
添加SplitContainer
,其中您将添加PieChartControl
和BarChartControl
。
3)在Form1
和Form2
中也暴露SetDataSource()
方法(它只会调用相应的内部控制方法)
4)在Form3
中也暴露SetDataSource()
方法;它将调用PieChartControl
和BarChartControl
的内部SetDataSource()
方法。
5) Form3
还必须公开一个自定义属性(例如ChartClicked
),指示已单击的图表
6)在Form3中,为PieChartControl
和BarChartControl
订阅Click
事件(或DoubleClick
,根据您的意愿)
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();
}
}
}
对此:
// 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);
}
}
Form2:
// 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;
}
}
我可以想到几个方法。
1)让您的图表连接到数据源以获取其数据。表格1中的图表和表格3中的图表1连接到数据源1。表格2中的图表和表格3中的图表2连接到另一个数据源。图表将显示相同的数据,因此它们的外观将是相同的。这就像许多标准控件一样。然而,如果用户可以与你的图表进行交互,你就需要阻止表单3中的图表的交互(具有只读属性),并将表单1和2中的图表中的所有事件复制到表单3中的图表中。
2)向表单1和2(或图表1和2)添加一个方法,使它们当前显示为Image。表单3包含2个显示这些图像的PictureBox控件。如果有任何交互,您可以定期获得计时器事件上的图像。您的图表控件可能会有一个图像的缓存副本,无论如何都可以快速检索。