C# 如何以另一种形式(如overview)显示两个表单中的两个图表

C# 如何以另一种形式(如overview)显示两个表单中的两个图表,c#,.net,winforms,charts,C#,.net,Winforms,Charts,我正在实施图表控件。。。。 我有三张表格,一张表格二张表格三 在表格1中,我以饼图的形式显示了一些数据 表格2我以条形图的形式展示了一些数据。。这很好 我的问题是我想在表3中显示这两个图表,就像在视图中一样。。。用户将在其中看到所有图表 因此,当我点击按钮时,表格3将与两个图表并排打开(一个是表格1中的饼图,另一个是表格2中的条形图),如果你点击表格3中的一个图表,它将进入相应的表格..像这样 有没有人知道如何实施 事先非常感谢……我可以想出几种方法来做这件事 1) 让您的图表连接到其数据的数据

我正在实施图表控件。。。。 我有三张表格,一张表格二张表格三

在表格1中,我以饼图的形式显示了一些数据

表格2我以条形图的形式展示了一些数据。。这很好

我的问题是我想在表3中显示这两个图表,就像在视图中一样。。。用户将在其中看到所有图表

因此,当我点击按钮时,表格3将与两个图表并排打开(一个是表格1中的饼图,另一个是表格2中的条形图),如果你点击表格3中的一个图表,它将进入相应的表格..像这样

有没有人知道如何实施


事先非常感谢……

我可以想出几种方法来做这件事

1) 让您的图表连接到其数据的数据源。表1中的图表和表3中的图表1连接到数据源1。表格2中的图表和表格3中的图表2连接到另一个数据源。图表将显示相同的数据,因此它们的外观将是相同的。这与许多标准控件类似。但是,如果用户可以与您的图表进行交互,则您需要为表格3中的图表阻止该交互(具有只读属性),并将表格1和表格2中的图表中的所有事件复制到表格3中的图表


2) 将方法添加到表单1和2(或图表1和2)以获取其当前显示为图像。表单3包含两个显示这些图像的PictureBox控件。如果存在任何交互,您可以定期在计时器事件上获取图像。您的图表控件可能会有一个可以快速检索的图像缓存副本。

我可以想出几种方法

1) 让您的图表连接到其数据的数据源。表1中的图表和表3中的图表1连接到数据源1。表格2中的图表和表格3中的图表2连接到另一个数据源。图表将显示相同的数据,因此它们的外观将是相同的。这与许多标准控件类似。但是,如果用户可以与您的图表进行交互,则您需要为表格3中的图表阻止该交互(具有只读属性),并将表格1和表格2中的图表中的所有事件复制到表格3中的图表


2) 将方法添加到表单1和2(或图表1和2)以获取其当前显示为图像。表单3包含两个显示这些图像的PictureBox控件。如果存在任何交互,您可以定期在计时器事件上获取图像。您的图表控件可能会有一个可以快速检索的图像缓存副本。

我会这样做:

1) 创建两个包含mschart的用户控件,并调用它们,例如
PieChartControl
BarChartControl
。公开设置当前数据源的方法(例如,
SetDataSource(DataTable dt)
),并将数据源绑定到饼图或条形图的逻辑放在那里

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

3) Expose
SetDataSource()
方法也在
Form1
Form2
中(它将只调用相应的内部控制方法)

4) 还公开
Form3
中的
SetDataSource()
方法;它将调用内部
PieChartControl
BarChartControl
SetDataSource()
方法

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

6) 在表格3中,订阅
PieChartControl
BarChartControl

7) 当触发
Click
事件时,只需设置ChartClicked属性并关闭表单


下面是一些代码示例,帮助您理解我的解释

助手枚举:

public enum ChartClicked {  None = 0, Pie = 1, Bar = 2 }
// 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();
   }
}
// the form having the pie chart control
public partial class Form1: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.PieChartControl.SetDataSource(src);
   }
}
MainForm:

public enum ChartClicked {  None = 0, Pie = 1, Bar = 2 }
// 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();
   }
}
// the form having the pie chart control
public partial class Form1: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.PieChartControl.SetDataSource(src);
   }
}
表格3:

public enum ChartClicked {  None = 0, Pie = 1, Bar = 2 }
// 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();
   }
}
// the form having the pie chart control
public partial class Form1: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.PieChartControl.SetDataSource(src);
   }
}
表格1:

public enum ChartClicked {  None = 0, Pie = 1, Bar = 2 }
// 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();
   }
}
// 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);
   }
}
public partial PieChartControl: UserControl
{
   // other methods ...
   public void SetDataSource(object src)
   {
      // set the series type to Pie etc... 
      this.chart.DataSource = src;
   }
}
piechart控件:

// the form having the bar chart control
public partial class Form2: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.BarChartControl.SetDataSource(src);
   }
}
public partial PieChartControl: UserControl
{
   // other methods ...
   public void SetDataSource(object src)
   {
      // set the series type to Pie etc... 
      this.chart.DataSource = src;
   }
}

我会这样做:

1) 创建两个包含mschart的用户控件,并调用它们,例如
PieChartControl
BarChartControl
。公开设置当前数据源的方法(例如,
SetDataSource(DataTable dt)
),并将数据源绑定到饼图或条形图的逻辑放在那里

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

3) Expose
SetDataSource()
方法也在
Form1
Form2
中(它将只调用相应的内部控制方法)

4) 还公开
Form3
中的
SetDataSource()
方法;它将调用内部
PieChartControl
BarChartControl
SetDataSource()
方法

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

6) 在表格3中,订阅
PieChartControl
BarChartControl

7) 当触发
Click
事件时,只需设置ChartClicked属性并关闭表单


下面是一些代码示例,帮助您理解我的解释

助手枚举: