我如何将两个表格中的两个图表显示为另一种形式,如概述

本文关键字:两个 另一种 显示 表格 | 更新日期: 2023-09-27 18:08:04

我正在实现图表控件....我有三个表单form1 form2 form3 .....

我正在用饼状图的形式展示一些数据 我正在用柱状图的形式展示一些数据。

我的问题是,我想把这两个图表显示在表格3中,就像在视图中一样…用户可以看到所有的图表…

所以当我点击按钮时,表单3将打开两个图表并排(一个是form1的饼状图,另一个是form2的条形图)如果你点击form3中的其中一个图表它将进入相应的表单。像这样....

有人知道如何实现这个吗?

Many Thanks advance....

我如何将两个表格中的两个图表显示为另一种形式,如概述

我会这样做:

1)创建2个包含mschart的用户控件,并将其命名为PieChartControlBarChartControl。暴露一个方法来设置当前的数据源(例如SetDataSource(DataTable dt)),并把逻辑绑定到数据源的PieChart或条形图

2)创建3个表单:在Form1添加PieChartControl,在Form2添加BarChartControl,在Form3添加SplitContainer,其中您将添加PieChartControlBarChartControl

3)在Form1Form2中也暴露SetDataSource()方法(它只会调用相应的内部控制方法)

4)在Form3中也暴露SetDataSource()方法;它将调用PieChartControlBarChartControl的内部SetDataSource()方法。

5) Form3还必须公开一个自定义属性(例如ChartClicked),指示已单击的图表

6)在Form3中,为PieChartControlBarChartControl订阅Click事件(或DoubleClick,根据您的意愿)

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();
      }    
   }
}

对此:

// 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控件。如果有任何交互,您可以定期获得计时器事件上的图像。您的图表控件可能会有一个图像的缓存副本,无论如何都可以快速检索。